1

私は次のものを持っています

var leftMouseDown = Observable.FromEvent<MouseButtonEventArgs>(displayCanvas, "MouseLeftButtonDown");
var leftMouseUp = Observable.FromEvent<MouseButtonEventArgs>(displayCanvas, "MouseLeftButtonUp");
var mouseMove = Observable.FromEvent<MouseEventArgs>(displayCanvas, "MouseMove");

var leftMouseDragging = from down in leftMouseDown
                        let startPoint = down.EventArgs.GetPosition(displayCanvas)
                        from move in mouseMove.TakeUntil(leftMouseUp)
                        let endPoint = move.EventArgs.GetPosition(displayCanvas)
                        select new { Start = startPoint, End = endPoint };

サブスクライブすると、ドラッグの開始点と現在の終了点が得られます。ドラッグが完了したら、何かをする必要があります。RXでこれを完全に実行しようとして失敗し、最終的に実行しました

leftMouseDragging.Subscribe(value=>
    {
        dragging = true;
        //Some other code
    });

leftMouseUp.Subscribe(e=>
    {
        if(dragging)
        {
            MessageBox.Show("Just finished dragging");
            dragging = false;
        }
    });

マウスの右ボタンをドラッグするまで、これは正常に機能します。次に、マウスの左ボタンをクリックすると、メッセージ ボックスが表示されます。左ボタンのドラッグのみを行うと、メッセージ ボックスが表示され、マウスの左ボタンをクリックしてもボックスが生成されません。外部状態なしでこれを行いたいのですが、少なくともそれが適切に機能することを望んでいます。

参考:ドラッグを揮発性にしてロックを使用しようとしましたが、うまくいきませんでした。

編集

私の問題は右クリックのコンテキストメニューにあったことがわかりました。それを取り除くと、上記のコードが機能しました。だから、今私の問題は、コンテキストメニューを表示し、コードを機能させる方法です。コンテキスト メニューがマウスの左クリックを処理していたため、何らかの理由でコードが機能しなかったと思いますが、まだ困惑しています。

4

1 に答える 1

5

必要なのはドラッグだけである場合、単純な .Zip は機能しませんか? :

var drag = _mouseDown
    .Select(args => args.EventArgs.GetPosition(canvas))
    .Zip(_mouseUp.Select(args => args.EventArgs.GetPosition(canvas)), 
        (p1, p2) => new { p1, p2 });
drag.Subscribe(p1p2 => 
        Console.WriteLine(@"({0}:{1})({2}:{3})", 
            p1p2.p1.X, p1p2.p1.Y, p1p2.p2.X, p1p2.p2.Y));

長さゼロのドラッグを除外する必要がある場合は、Where フィルターを適用できます。

編集: ただし、Zip は、ウィンドウの外でマウスを解放することに対して脆弱です。その場合、キャプチャしない限り、mouseUp を取得できません。これは、mouseUp の前に最新の mouseDown のみを使用するバージョンです。

var drag = _mouseDown
    .Select(args => args.EventArgs.GetPosition(canvas))
    .TakeUntil(_mouseUp)
    .CombineLatest(_mouseUp
        .Select(args => args.EventArgs.GetPosition(canvas))
        .Take(1), (p1, p2) => new { p1, p2 })
    .Repeat();
于 2010-04-25T01:25:25.750 に答える