在 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 中同时启用 ScrollViewerHorizontalScrollMode,在 [=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>

希望这对某人有所帮助。