Я разрабатываю настольное приложение WPF, к которому подключено устройство с сенсорным экраном.В XAML определяется вложенный ListView, так что приложение может показывать, например, 8 изображений (4x2), и пользователь может прокручивать до следующего блока из 8 изображений.
На других страницах упоминается, что вы можете выполнять прокрутку с помощью сенсорного устройства, установив PanningMode
на ScrollViewer
.Однако это не работает для моего решения.
Вставленный код был сокращен для удобства чтения.
Итак, я создал статический класс MainScrollExtension
, который используется внутриListView
element:
<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));
The handleScrollChanged
подписывается на упомянутые события:
FrameworkElement container = d as FrameworkElement;
container.PreviewTouchDown += onPreviewTouchDown;
container.TouchMove += onTouchMove;
container.TouchUp += onTouchUp;
onTouchMove
управляет прокруткой первого ListView
элемента управления.Нажатие вне элемента и перемещение пальца прокручивает содержимое.
Однако я также хочу прокрутить содержимое, если палец делает TouchMove
на элементе (и допускает некоторое отклонение перемещения).Поэтому нажатие на элемент ничего не должно делать.Отпускание должно выбрать, а перемещение, а отпускание - только прокрутка.Текущая ситуация заключается в нажатии на элемент и его небольшом перемещении для выбора элемента.
Вложенный ListView
работает с прокруткой, когда SelectedItem
не используется.Но мне нужен выбранный элемент, когда пользователь выбирает его (я понимаю, что выбор элемента пальцем, вероятно, приведет к событию TouchMove, но установка некоторого порога должна быть возможной для регистрации его в качестве выбора)
nested 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.
Итак, в основном, как мне перестать выбирать элемент при перемещении по этому элементу?