单击和双击事件在画布中不按预期工作

时间:2010-07-12 09:01:47

标签: c# .net wpf canvas mouseevent

Canvas中有一个UserControl,我已将DoubleClick事件附加到UserControl这样的<{p}}

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

我正在使用此事件处理程序来实现全屏功能。

现在,Canvas可以在其中放置各种控件。对于这些控件实现了拖放功能,类似于this 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 个答案:

答案 0 :(得分:4)

知道了,我使用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;
    }
}

答案 1 :(得分:0)

你需要做的是,在鼠标启动时启动一个计时器,应该从SystemInformation.DoubleClickTime检索时间,并在计时器勾选上执行点击操作(仅当你没有检测到双击时)平均时间,显然)。

同样使用SystemInformation.DragSize来防止意外拖放。

注意,SystemInformation类是WinForms的一部分,因此您需要添加对System.Windows.Forms的引用,此类在WPF应用程序中可以正常工作。