Могу ли я сделать выбор изменений в WPF ListBox только при нажатии левой кнопки
У меня есть WPF ListBox
работа в режиме одиночного выбора. Я добавляю перетаскивание для перемещения предметов. В настоящее время ListBox
выбор реагирует на нажатие левой кнопки, а затем перемещение мыши с нажатой левой кнопкой. Так что после того, как я жду MinimumVerticalDragDistance
чтобы начать операцию перетаскивания, можно выбрать другой элемент. Перетаскивание либо невыбранного оригинального элемента, либо перетаскивание нового выбранного элемента сбивает с толку. Добавление 'e.Handled=true' в xxx_MouseMove
или ххх_PreviewMouseMove
ничего не делает Любые идеи по подавлению этого выбора из-за движений мыши с левой кнопкой вниз?
1 ответ
Лучший клудж, который я придумал, - это отменить ListBox "Selection by draging" в событии IsMouseCapturedChanged.
public partial class MainWindow : Window
{
Rect? dragSourceGestureRect;
bool busy;
public MainWindow()
{
InitializeComponent();
listBox.ItemsSource = Enumerable.Range(1, 9);
listBox.PreviewMouseLeftButtonDown += listBox_PreviewMouseLeftButtonDown;
listBox.IsMouseCapturedChanged += listBox_IsMouseCapturedChanged;
listBox.MouseMove += listBox_MouseMove;
}
void listBox_IsMouseCapturedChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (busy)
return;
if (!listBox.IsMouseCaptured)
dragSourceGestureRect = null;
else if (dragSourceGestureRect.HasValue)
{
busy = true;
{
//tell the ListBox to cancel it's "Selection by dragging"
listBox.ReleaseMouseCapture();
//Now recapture the mouse for canceling my dragging
listBox.CaptureMouse();
}
busy = false;
}
}
void listBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var center = e.GetPosition(listBox);
dragSourceGestureRect = new Rect(
center.X - SystemParameters.MinimumHorizontalDragDistance / 2,
center.Y - SystemParameters.MinimumVerticalDragDistance / 2,
SystemParameters.MinimumHorizontalDragDistance,
SystemParameters.MinimumVerticalDragDistance);
}
void listBox_MouseMove(object sender, MouseEventArgs e)
{
if (!dragSourceGestureRect.HasValue || dragSourceGestureRect.Value.Contains(e.GetPosition(listBox)))
return;
dragSourceGestureRect = null;
var data = new DataObject(DataFormats.UnicodeText, "The Data");
DragDrop.DoDragDrop(listBox, data, DragDropEffects.Copy);
e.Handled = true;
}
}