Могу ли я сделать выбор изменений в 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;
    }
}
Другие вопросы по тегам