代码之家  ›  专栏  ›  技术社区  ›  serhio

鼠标单击和双击的区别

  •  2
  • serhio  · 技术社区  · 14 年前

    WPF, Shapes

    我有个习惯 Shape ,并尝试实现 MouseClick MouseDoubleClick 上面的东西。

    我需要 打开信息窗口 关于MyShape OnClick和 选择 它在双击。

    存根如下:

    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 回复  |  直到 14 年前
        1
  •  2
  •   Saeed Amiri    14 年前

    在双击中的第一次单击和第二次单击之间,我认为大约有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
            }
        }
    
        2
  •  1
  •   Juan Pablo Califano    14 年前

    正如我在评论中所说,我曾经遇到过同样的问题。我需要检测到双击,但单击和双击应该作为单独的事件。这意味着,如果触发了双击,则不应触发单击(因为每个操作在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...
    
            }           
        }
    
    
    }
    
        3
  •  0
  •   SLaks    14 年前

    每次双击都以单击开始。

        4
  •  0
  •   miguel    14 年前

    或者尝试一种依附的行为?

    Try this link for an explanation

    也许你可以把事件汇总起来…我想这就是你想做的,对吧?