События Single и Double click не работают должным образом на холсте

У меня есть Canvas, который присутствует в UserControl, я привязал событие DoubleClick к этому UserControl вот так

mainWindow.CanvasLayout.MouseDoubleClick += 
new MouseButtonEventHandler(CanvasLayout_MouseDoubleClick);

Я использую этот обработчик событий для достижения полноэкранной функциональности.

Теперь внутри Canvas могут быть размещены различные элементы управления. Для этих элементов управления реализована функция перетаскивания, аналогичная этой статье codeproject.

По сути, я обрабатываю эти события для элемента управления -

this._dragSource.PreviewMouseLeftButtonDown +=
new MouseButtonEventHandler(DragSource_PreviewMouseLeftButtonDown);

this._dragSource.PreviewMouseMove += 
new System.Windows.Input.MouseEventHandler(DragSource_PreviewMouseMove);

this._dragSource.PreviewMouseLeftButtonUp += 
new MouseButtonEventHandler(DragSource_PreviewMouseLeftButtonUp);

Теперь, когда пользователь DoubleClicks на элементе управления (присутствует в canvas), выполняются как операции DoubleClick (полный экран), так и одиночные операции Click (перетаскивание), т. е. если пользователь дважды щелкает элемент управления и быстро меняет положение мыши, положение элемента управления изменяется ( его перетащили на новое место).

Можно ли каким-либо образом предотвратить операцию перетаскивания, когда пользователь дважды щелкает элемент управления?


person akjoshi    schedule 12.07.2010    source источник


Ответы (2)


Понятно, вместо обработки события MouseDoubleClick я использовал PreviewMouseLeftButtonDown -

mainWindow.CanvasLayout.PreviewMouseLeftButtonDown 
+= new MouseButtonEventHandler(CanvasLayout_PreviewMouseLeftButtonDown);

и

void CanvasLayout_PreviewMouseLeftButtonDown(object s, MouseButtonEventArgs e)
{
    if (e.ClickCount > 1)
    {
        // Do double-click code  
        // Code for FullScreen 
        e.Handled = true;
    }
}
person akjoshi    schedule 12.07.2010
comment
Только что спас мою задницу от проблемы перетаскивания, используя одно из действий перетаскивания WPF MVVM в сети. Отличное решение! Спасибо! - person Locke; 21.06.2013

Что вам нужно сделать, так это запустить таймер при включении мыши, время должно быть получено из SystemInformation.DoubleClickTime и выполните действие щелчка по отметке таймера (только если вы, очевидно, не обнаружили двойной щелчок за это время).

Аналогичным образом используйте SystemInformation.DragSize, чтобы предотвратить случайное перетаскивания.

Обратите внимание, что класс SystemInformation является частью WinForms, поэтому вам нужно добавить ссылку на System.Windows.Forms, этот класс будет отлично работать в приложениях WPF.

person Nir    schedule 12.07.2010
comment
Спасибо, Нир, я планировал попробовать таймер, но смог решить проблему без него. - person akjoshi; 12.07.2010