2

WPF, Shapes

我有一个 custom 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

4 回答 4

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
        }
    }
于 2010-11-21T17:32:14.817 回答
1

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

        }           
    }


}
于 2010-11-21T17:28:59.493 回答
0

每个 DoubleClick 都以单击开始。

于 2010-11-21T16:41:36.600 回答
0

也许尝试附加行为?

试试这个链接以获得解释

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

于 2010-11-21T16:44:29.420 回答