Как перетаскивать элементы из прокручиваемого ListView с помощью касания, без необходимости удерживать элемент [UWP] - PullRequest
0 голосов
/ 28 февраля 2019

В существующем состоянии функция перетаскивания элемента из из ListView означает, что пользователю придется долго нажимать или «удерживать» элемент, чтобы активировать функцию перетаскивания элемента.element.

Проблема в том, что наше живое тестирование показало, что это далеко не интуитивно понятно для конечного пользователя.

Я наткнулся на этот вопрос с несколькими интересными идеями.но комментарии указывают, что в конце концов они не смогли найти решение, и последнее действие было 3 года назад.

Возможно, кто-то тем временем нашел решение или обходной путь?В данном случае я использую ListView, потому что должен быть прокручиваемым по горизонтали, но мне нужно, чтобы images внутри ListView был перетаскиваемым по вертикали и отделенным от ListView.

1 Ответ

0 голосов
/ 15 марта 2019

@ AdamMcMahon из звуков вашего поста, вы хотите, чтобы элементы изображения в вашем списке реагировали на перетаскивание на ощупь (PointerPressed), что само по себе возможно и довольно просто, подключив шаблоны элементов списка вдольследующие строки:

<DataTemplate x:Key="ListViewItemTemplate1" x:DataType="x:String">
     <Grid>
         <Image Source="{x:Bind}" CanDrag="True" PointerPressed="Image_PointerPressed" DragStarting="Image_DragStarting" />
     </Grid>
</DataTemplate>

И добавление чего-либо по строкам следующих обработчиков событий

private async void Image_PointerPressed(object sender, PointerRoutedEventArgs e)
    {            
        var image = sender as Image;
        var pointerPoint = e.GetCurrentPoint(sender as UIElement);
        var dropStatus = await image.StartDragAsync(pointerPoint);
    }

    private void Image_DragStarting(UIElement sender, DragStartingEventArgs args)
    {
        args.Data.Properties.Add("myKey", sender);
    }

И обработчик для вашей цели перетаскивания, что-то вроде

        private async void TargetImage_Drop(object sender, DragEventArgs e)
    {
        Image result = e.DataView.Properties["myKey"] as Image;

        TargetImage.Source = result.Source;
    }

Однако в основе проблемы лежит то, что горизонтальная прокрутка прокрутки и операция перетаскивания мешают друг другу, а также типичные обходные пути, которые вы можете попробовать в событии PointerMoved, чтобы проверить, находится ли движение в горизонтальном или вертикальном положении.Направление не так просто реализовать, потому что ScrollViewer поглощает большинство событий PointerMoved, как описано здесь: https://blogs.msdn.microsoft.com/wsdevsol/2013/02/15/where-did-all-my-gestures-go/

Таким образом, в зависимости от взаимодействия с пользователем, вы в конечном итоге можете попытаться отключить два взаимодействия пользователяперетаскивания и прокрутки.Например, вы можете поместить левую и правую кнопки прокрутки в конце списка, чтобы предоставить пользователю способ прокрутки списка и зарезервировать взаимодействие прямого касания со списком для запуска операций перетаскивания.

Код, подобный следующему, можетиспользоваться для прокрутки влево

        private void ScrollLeftButton_Click(object sender, RoutedEventArgs e)
    {
        Border border = VisualTreeHelper.GetChild(ImageListview, 0) as Border;
        ScrollViewer scrollViewer = border.Child as ScrollViewer;
        scrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
        scrollViewer.ChangeView(scrollViewer.HorizontalOffset + 100, null, null);
        scrollViewer.HorizontalScrollMode = ScrollMode.Disabled;
    }

Другой вариант может заключаться в том, чтобы ввести два режима взаимодействия с кнопкой, которая включает и выключает режим прокрутки.Когда scrollOn bool имеет значение true, вы не запускаете StartDrag в PointerPressed, когда это ложно, вы делаете.Это дало бы пользователю как плавную прокрутку списка, так и простое перетаскивание из списка, но работало бы только тем или иным способом в любой данный момент времени.

Возможно, исходя из конкретного опыта, который вы пытаетесьчтобы предоставить своим пользователям, вы можете подумать о других способах разделения двух взаимодействий для ваших пользователей.

HTH.

...