DragAndDrop в ListView не задевая панель скроллинга
При вызове ивента MouseMove и последующем Drag&Drop при выделенном элементе в GridView внутри ListView срабатывает ивент даже если курсор сейчас на панели пролистывания, то есть при таком методе перетаскивания невозможно проскроллить ListView, можно ли как-то "убрать" срабатывание ивента MouseMove, вернее DragAndDrop'a, если курсор сейчас находится напротив ScrollBar'a?
<ListView x:Name="listView"...
MouseMove="lstItems_MouseMove"
>
private void listView_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (e.Source != null)
{
DataModel selectedItem = (DataModel)listView.SelectedItem;
DragDrop.DoDragDrop(listView, selectedItem, DragDropEffects.Move);
}
}
}
Ответы (1 шт):
Решилось следующим образом:
protected void LstItems_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
; //Если точный объект, на котором вызывается событие – это объект ListView Item
if (null == (((FrameworkElement)e.OriginalSource).DataContext as Composition))
return;
if (e.ButtonState == MouseButtonState.Pressed)
{
if (e.Source != null)
{
List<IComposition> myList = new List<IComposition>();
foreach (IComposition Item in lstItems.SelectedItems)
{
myList.Add(Item);
}
DataObject dataObject = new DataObject(myList);
DragDrop.DoDragDrop(lstItems, dataObject, DragDropEffects.Move);
}
}
//ApplyToSelectedItems(RenameCompositionFiles);
}
<ListView ...
PreviewMouseLeftButtonDown="lstItems_MouseLeftButtonDown"
Здесь Composition - это тип объекта из коллекции ItemsSource для ListView/GridView.
Если нужно, чтобы DrapAndDrop включался только после того, как мышь нажата и передвинута, то можно также вставить дополнительный метод через Dispatcher, чтобы PreviewMouseMove не блокировал выбор элемента из списка, если не работает событие "MouseLeftButtonDown" из-за особенностей реализации, а собития Click у ListView нету, тогда делаем по типу:
private void lstItems_MouseLeftButtonDown(object sender, MouseButtonState state, object source)
{
Application.Current.Dispatcher.BeginInvoke(
new Action(delegate
{
// вставьте здесь обработку нажатия кнопки уже после щелчка по текущему элементу, типа вызова DragAndDrop (код из предыдыщуего метода)
})
);
}
protected void LstItems_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
; // И вызываем пост-обработку нажатия кнопки с перетаскиванием через таск
var tsk = Task.Factory.StartNew(() =>
lstItems_MouseLeftButtonDown(sender, e.ButtonState, e.Source)
);
}
