MouseClick和DoubleClick之间的区别

时间:2010-11-21 16:35:15

标签: .net wpf .net-4.0 wpf-controls mouseclick-event

WPF, Shapes

我有自定义Shape,并尝试在其上实施MouseClickMouseDoubleClick内容。

通过例如。我需要打开一个关于MyShape OnClick的信息窗口,然后选择它OnDoubleClick。

存根如下:

public class MyShape : Shape
{
    public Point Point1, Point2;

    public MyShape() : base() { }

    protected override Geometry DefiningGeometry
    {
        get { return new LineGeometry(Point1, Point2); }
    }

    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
        base.OnMouseUp(e);
        if (e.ClickCount == 1)
        {
            // Open Informational Window
        }
        else if (e.ClickCount == 2)
        {
            // Select Item
        }
    }
}

每次我双击// Only do MouseClick// Only do MouseDoubleClick时都会发生。

有没有办法在WPF,.NET 4中避免这种情况?

4 个答案:

答案 0 :(得分:2)

在第一次点击和第二次点击之间双击我认为有一个时间大约50和400毫秒,所以波纹管代码不是最好的,但做的伎俩:

bool firstClicked = false;

    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
        base.OnMouseUp(e);
        if (e.ClickCount == 1)
        {
            firstClicked = true;
            Task tsk = new TaskFactory()
                            .StartNew(
                            () => 
                                {
                                    Thread.Sleep(SystemInformation.DoubleClickTime);
                                    if (firstClicked)
                                    {
                                        // if you want to use `e`
                                        // e.Source
                                        // Open Informational Window
                                    }
                                        firstClicked = false;
                                    }
                                        );

                                }

        }
        else if (e.ClickCount == 2)
        {
            firstClicked = false;
            // Select Item
        }
    }

答案 1 :(得分:1)

正如我在评论中所说,我曾经遇到过同样的问题。我需要检测双击,但点击和双击应该表现为单独的事件。这意味着,如果触发了双击,则不应触发单击(因为每个操作在UI中具有不同且不兼容的效果)。

“本机”双击对我来说不起作用,因为点击事件会触发是否发生了双击。这是Actionscript中的一些示例代码。我相信你能够遵循(简单)逻辑在.net中实现它。请注意,我正在硬编码双击时间,因为我无法从Actionscript获取系统值。这不是理想的,但我必须做出妥协。您应该使用操作系统(或运行时)提供的时间间隔(如果您可以使用它)。

希望它有所帮助。

package {
    import flash.events.*;
    import flash.display.*;
    import flash.utils.*;

    public class Button extends Sprite {

        public function DCButton() {
            super();
            graphics.beginFill(0xff0000);
            graphics.drawRect(0,0,100,100);
            graphics.endFill();
            addEventListener(MouseEvent.CLICK,handleClick);
        }

        private var _clickCount:int = 0;
        private var _doubleClickInterval:int = 200;

        private function handleClick(e:MouseEvent):void {
            _clickCount++;
            //  start the timer and when it completes, check the number of clicks
            //  based on this, dispatch either click or doubleClick events
            if(_clickCount == 1) {
                setTimeout(checkDoubleClick,_doubleClickInterval,e);
            }
            else
            {
                checkDoubleClick(e);
            }

        }   

        private function checkDoubleClick(e:MouseEvent):void {

            if(_clickCount == 0) return;

            var type:String;

            if(_clickCount == 1) {
                type="click";
            } else if(_clickCount > 1) {
                type="doubleClick";
            }

            trace(type);

            _clickCount = 0;
            //  dispatch the detected event here...

        }           
    }


}

答案 2 :(得分:0)

每个DoubleClick都以点击开始。

答案 3 :(得分:0)

也许尝试附加行为?

Try this link for an explanation

也许你可以汇总事件......我认为这就是你想要做的,对吧?