我正在开发一个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
是一个依赖项属性,可订阅TouchMove
,TouchUp
和PreviewTouchDown
事件。
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">
Root
是Page
控件,其中包含所有控件,并使用NavigationService
加载。我正在使用MVVM Light Toolkit开发该应用程序。
因此,基本上,在移动该项目时如何停止选择该项目?