在 Windows 10 UWP 中使用 C# 添加时,ScrollViewer 不适用于 ListView
ScrollViewer not working for ListView when added using C# in Windows 10 UWP
我动态添加了一个ListView,它正确显示了所有数据。现在随着数据量的增加,我想允许用户水平滚动而不是垂直滚动,所以我使用以下代码
为 ListView 添加了 ScrollViewer 属性
myListView = new ListView();
myListView.ItemsPanel = App.Current.Resources["MyItemsPanel"] as ItemsPanelTemplate;
myListView.ItemTemplate = App.Current.Resources["myListTemplate"] as DataTemplate;
myListView.ItemContainerStyle = App.Current.Resources["GenericListViewContainerStyle"] as Style;
myListView.SelectionMode = ListViewSelectionMode.Multiple;
myListView.Margin = new Thickness(10);
myListView.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled);
myListView.SetValue(ScrollViewer.VerticalScrollModeProperty, ScrollMode.Disabled);
myListView.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden);
myListView.SetValue(ScrollViewer.HorizontalScrollModeProperty, ScrollMode.Auto);
项目面板模板
<ItemsPanelTemplate x:Key="MyItemsPanel">
<StackPanel Orientation="Horizontal">
<StackPanel.RenderTransform>
<TranslateTransform X="0" />
</StackPanel.RenderTransform>
</StackPanel>
</ItemsPanelTemplate>
有人可以指出这里有什么问题吗?我希望它能同时使用鼠标和触摸输入。我的 Current 在触摸输入时工作正常,但在使用鼠标指针时无法滚动。
Now as the amount of data increases I want to allow user to scroll horizontally and not vertically.
为此,您需要修改 ItemsPanel
的模板,并在 ListView
中同时启用 ScrollViewer
的 HorizontalScrollMode
,在 [=25] =] 是这样的:
<ListView ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Enabled">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
所以除了启用水平滚动模式的代码之外,当在后面的代码中定义它时,您还需要使用 VisualTreeHelper
获取 ItemsStackPanel
例如在 Loaded
您的 ListView
事件:
private void myListView_Loaded(object sender, RoutedEventArgs e)
{
var itemstackpanel = FindChildOfType<ItemsStackPanel>(myListView);
if (itemstackpanel != null)
itemstackpanel.Orientation = Orientation.Horizontal;
}
public static T FindChildOfType<T>(DependencyObject root) where T : class
{
var queue = new Queue<DependencyObject>();
queue.Enqueue(root);
while (queue.Count > 0)
{
DependencyObject current = queue.Dequeue();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)
{
var child = VisualTreeHelper.GetChild(current, i);
var typedChild = child as T;
if (typedChild != null)
{
return typedChild;
}
queue.Enqueue(child);
}
}
return null;
}
找到解决方案。
我删除了以下代码
myListView.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled);
myListView.SetValue(ScrollViewer.VerticalScrollModeProperty, ScrollMode.Disabled);
myListView.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden);
myListView.SetValue(ScrollViewer.HorizontalScrollModeProperty, ScrollMode.Auto);
并将以下代码添加到我的 ListView
mtListView.Style = App.Current.Resources["ListViewStyle"] as Style;
ListViewStyle
<Style x:Key="ListViewStyle" TargetType="ListView">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.HorizontalScrollMode" Value="Enabled"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled"/>
<Setter Property="ScrollViewer.VerticalScrollMode" Value="Disabled"/>
</Style>
希望这对某人有所帮助。
我动态添加了一个ListView,它正确显示了所有数据。现在随着数据量的增加,我想允许用户水平滚动而不是垂直滚动,所以我使用以下代码
为 ListView 添加了 ScrollViewer 属性myListView = new ListView();
myListView.ItemsPanel = App.Current.Resources["MyItemsPanel"] as ItemsPanelTemplate;
myListView.ItemTemplate = App.Current.Resources["myListTemplate"] as DataTemplate;
myListView.ItemContainerStyle = App.Current.Resources["GenericListViewContainerStyle"] as Style;
myListView.SelectionMode = ListViewSelectionMode.Multiple;
myListView.Margin = new Thickness(10);
myListView.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled);
myListView.SetValue(ScrollViewer.VerticalScrollModeProperty, ScrollMode.Disabled);
myListView.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden);
myListView.SetValue(ScrollViewer.HorizontalScrollModeProperty, ScrollMode.Auto);
项目面板模板
<ItemsPanelTemplate x:Key="MyItemsPanel">
<StackPanel Orientation="Horizontal">
<StackPanel.RenderTransform>
<TranslateTransform X="0" />
</StackPanel.RenderTransform>
</StackPanel>
</ItemsPanelTemplate>
有人可以指出这里有什么问题吗?我希望它能同时使用鼠标和触摸输入。我的 Current 在触摸输入时工作正常,但在使用鼠标指针时无法滚动。
Now as the amount of data increases I want to allow user to scroll horizontally and not vertically.
为此,您需要修改 ItemsPanel
的模板,并在 ListView
中同时启用 ScrollViewer
的 HorizontalScrollMode
,在 [=25] =] 是这样的:
<ListView ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Enabled">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
所以除了启用水平滚动模式的代码之外,当在后面的代码中定义它时,您还需要使用 VisualTreeHelper
获取 ItemsStackPanel
例如在 Loaded
您的 ListView
事件:
private void myListView_Loaded(object sender, RoutedEventArgs e)
{
var itemstackpanel = FindChildOfType<ItemsStackPanel>(myListView);
if (itemstackpanel != null)
itemstackpanel.Orientation = Orientation.Horizontal;
}
public static T FindChildOfType<T>(DependencyObject root) where T : class
{
var queue = new Queue<DependencyObject>();
queue.Enqueue(root);
while (queue.Count > 0)
{
DependencyObject current = queue.Dequeue();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)
{
var child = VisualTreeHelper.GetChild(current, i);
var typedChild = child as T;
if (typedChild != null)
{
return typedChild;
}
queue.Enqueue(child);
}
}
return null;
}
找到解决方案。
我删除了以下代码
myListView.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled);
myListView.SetValue(ScrollViewer.VerticalScrollModeProperty, ScrollMode.Disabled);
myListView.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden);
myListView.SetValue(ScrollViewer.HorizontalScrollModeProperty, ScrollMode.Auto);
并将以下代码添加到我的 ListView
mtListView.Style = App.Current.Resources["ListViewStyle"] as Style;
ListViewStyle
<Style x:Key="ListViewStyle" TargetType="ListView">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.HorizontalScrollMode" Value="Enabled"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled"/>
<Setter Property="ScrollViewer.VerticalScrollMode" Value="Disabled"/>
</Style>
希望这对某人有所帮助。