События одиночного и двойного щелчка не работают должным образом на холсте - PullRequest
2 голосов
/ 12 июля 2010

У меня есть 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 (перетаскивание), т. Е. Если пользователь дважды щелкает элемент управления и быстро измените положение мыши, измените положение управления (его перетаскивают в новое положение).

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

Ответы [ 2 ]

4 голосов
/ 12 июля 2010

Понял, вместо обработки события 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;
    }
}
0 голосов
/ 12 июля 2010

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

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

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

...