2

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

4 に答える 4

2

ダブルクリックの最初のクリックと 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

コメントで言ったように、私はかつてこれとまったく同じ問題を抱えていました。ダブルクリックを検出する必要がありましたが、クリックとダブルクリックは別のイベントとして動作する必要があります。つまり、ダブルクリックが発生した場合、クリックは発生しないはずです (各アクションには異なる効果があり、UI で互換性がないため)。

ダブルクリックが発生したかどうかに関係なくクリックイベントが発生したため、「ネイティブ」ダブルクリックは機能しませんでした。Actionscript のサンプル コードを次に示します。(単純な)ロジックに従って.netに実装できると確信しています。Actionscript からシステム値を取得できなかったため、ダブルクリック時間をハードコーディングしていることに注意してください。理想的ではありませんが、妥協しなければなりませんでした。利用可能な場合は、代わりに OS (またはランタイム) によって提供される時間間隔を使用する必要があります。

それが役に立てば幸い。

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 に答える