WPF Вложенный список отключить выбор на просмотр прокрутки с TouchMove - PullRequest
0 голосов
/ 18 июня 2019

Я разрабатываю настольное приложение 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.

Итак, в основном, как мне перестать выбирать элемент при перемещении по этому элементу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...