@ 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.