WPF嵌套列表视图使用touchmove在滚动视图上禁用选择

时间:2019-06-18 11:55:27

标签: c# wpf xaml

我正在开发一个WPF桌面应用程序,该应用程序已连接有触摸屏设备。在XAML中,定义了一个嵌套的ListView,以便应用程序可以显示例如8张图像(4x2),并且用户可以滚动到下一张8张图像。

在其他页面上,提到可以通过在PanningMode上设置ScrollViewer来使用触摸设备滚动。但是,这不适用于我的解决方案。

粘贴的代码已缩短,易于阅读。

因此,我创建了一个静态MainScrollExtension类,该类在ListView元素内使用:

<ListView
            x:Name="MainListView"
            SelectedIndex="{Binding SelectedIndex}"
            ItemsSource="{Binding Live}"
            SelectionMode="Extended"
            IsSynchronizedWithCurrentItem="False"
            ScrollViewer.HorizontalScrollBarVisibility="Hidden"
            ScrollViewer.VerticalScrollBarVisibility="Disabled"
            ScrollViewer.CanContentScroll="False"
            ScrollViewer.PanningMode="HorizontalOnly"
            IsManipulationEnabled="True"
            listbox:MainScrollExtension.ScrollOnTouch="True">

MainScrollExtension.ScrollOnTouch是一个依赖项属性,可订阅TouchMoveTouchUpPreviewTouchDown事件。

public static class MainScrollExtension
{
    public static readonly DependencyProperty ScrollOnTouchProperty =
        DependencyProperty.RegisterAttached("ScrollOnTouch",
            typeof(bool),
            typeof(MainScrollExtension),
            new PropertyMetadata(false, handleScrollChanged));

handleScrollChanged订阅了上述事件:

FrameworkElement container = d as FrameworkElement;
container.PreviewTouchDown += onPreviewTouchDown;
container.TouchMove += onTouchMove;
container.TouchUp += onTouchUp;

onTouchMove处理第一个ListView控件的滚动。在项目外部按动手指将滚动内容。

但是,如果手指在某个项目上进行TouchMove(并且允许一些移动公差),我也想滚动内容。因此,按下某个项目应该什么都不做。放开它应该选择并移动它并放开它应该只滚动。当前的情况是按一个项目并将其移动一点就可以选择该项目。

当不使用ListView时,嵌套的SelectedItem可以滚动。但是我确实在用户选择项目时需要它(我知道用手指选择项目可能会导致TouchMove事件,但是设置一些阈值应该可以将其注册为选择内容)

嵌套的ListView

<ListView
                        ItemsSource="{Binding}"
                        SelectedItem="{Binding ElementName=Root, Path=DataContext.SelectedMedia}"
                        SelectionMode="Extended"
                        IsSynchronizedWithCurrentItem="False"
                        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                        ScrollViewer.VerticalScrollBarVisibility="Disabled"
                        ScrollViewer.CanContentScroll="False"
                        IsManipulationEnabled="True">

RootPage控件,其中包含所有控件,并使用NavigationService加载。我正在使用MVVM Light Toolkit开发该应用程序。

因此,基本上,在移动该项目时如何停止选择该项目?

0 个答案:

没有答案
相关问题