0

私はいくつかの長方形を持っています。私が実装しようとしているのは次のとおりです。

ユーザーが画面に触れると、長方形の間をスライドできます。次に指を離すと、最後に触れた長方形が選択されます。(四角形の外側を持ち上げても何もトリガーされません)

私の Lumia 920 のキーボードと同じように、指が間違った場所にあることを認識すると、正しい場所にスライドして離すと、正しい文字が画面に表示されます。

ヒーローたちに感謝します!

4

1 に答える 1

0

コントロールで MouseLeftButtonDown が最初にトリガーされた場合にのみ、MouseLeftButtonUp イベントがトリガーされるため、これは見た目よりも複雑です。

この結果を達成するには、次の 2 つの方法があります。

  1. 同じ MouseLeftButtonDown および MouseLeftButtonUp イベント ハンドラーをすべての四角形に割り当てます。MouseLeftButtonDown で、CaptureMouseメソッドを呼び出します (カーソルがコントロールの上になくても、マウス イベントの追跡を続行するようにコントロールに指示します)。

    private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        ((UIElement)sender).CaptureMouse();
    }
    

    MouseLeftButtonDown で、マウスを離し、 を使用して、イベントVisualTreeHelper.FindElementsInHostCoordinatesがトリガーされたときにカーソルがあった四角形を見つけます。

    private void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        var element = (UIElement)sender;
    
        element.ReleaseMouseCapture();
    
        var mouseUpRectangle = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(this), this.ContentPanel)
            .OfType<Rectangle>()
            .FirstOrDefault();
    
        if (mouseUpRectangle != null)
        {
            Debug.WriteLine("MouseUp in " + mouseUpRectangle.Name);
        }
    }
    

    (ContentPanel を、すべてのコントロールを配置したコンテナーの名前に置き換えます)

  2. テストされていませんが、動作する可能性があります。すべての四角形を配置したコンテナーの MouseLeftButtonUp イベントをサブスクライブします。次に、同じロジックを使用して、ポインターの座標で四角形を取得します。

    private void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {                
        var mouseUpRectangle = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(this), this.ContentPanel)
            .OfType<Rectangle>()
            .FirstOrDefault();
    
        if (mouseUpRectangle != null)
        {
            Debug.WriteLine("MouseUp in " + mouseUpRectangle.Name);
        }
    }
    

詳細については、私が数か月前に書いたその記事を参照してください。

于 2013-08-01T12:06:52.777 に答える