Разница между MouseClick и DoubleClick - PullRequest
2 голосов
/ 21 ноября 2010

WPF, Shapes

У меня есть пользовательский Shape, и я пытаюсь реализовать на нем MouseClick и MouseDoubleClick.

К примеру. Мне нужно открыть информационное окно о 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 ]

2 голосов
/ 21 ноября 2010

Между первым и вторым щелчками по двойному щелчку. Я думаю, что есть время около 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 голос
/ 21 ноября 2010

Как я сказал в комментарии, однажды у меня была та же самая проблема.Мне нужно было обнаруживать двойные щелчки, но щелчки и двойные щелчки должны вести себя как отдельные события.Это означает, что если был выполнен двойной щелчок, щелчок не должен срабатывать (поскольку каждое действие имело разные и несовместимые эффекты в пользовательском интерфейсе).

«Собственный» двойной щелчок не работал для меня, поскольку срабатывали события щелчкапроизошел двойной щелчок или нет.Вот пример кода в 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...

        }           
    }


}
0 голосов
/ 21 ноября 2010

возможно попробовать присоединенное поведение?

Попробуйте эту ссылку для объяснения

Может быть, вы можете объединить события ... я думаю, это то, что вы пытаетесьделать, верно?

0 голосов
/ 21 ноября 2010

Каждый DoubleClick начинается с клика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...