私はいくつかの長方形を持っています。私が実装しようとしているのは次のとおりです。
ユーザーが画面に触れると、長方形の間をスライドできます。次に指を離すと、最後に触れた長方形が選択されます。(四角形の外側を持ち上げても何もトリガーされません)
私の Lumia 920 のキーボードと同じように、指が間違った場所にあることを認識すると、正しい場所にスライドして離すと、正しい文字が画面に表示されます。
ヒーローたちに感謝します!
私はいくつかの長方形を持っています。私が実装しようとしているのは次のとおりです。
ユーザーが画面に触れると、長方形の間をスライドできます。次に指を離すと、最後に触れた長方形が選択されます。(四角形の外側を持ち上げても何もトリガーされません)
私の Lumia 920 のキーボードと同じように、指が間違った場所にあることを認識すると、正しい場所にスライドして離すと、正しい文字が画面に表示されます。
ヒーローたちに感謝します!
コントロールで MouseLeftButtonDown が最初にトリガーされた場合にのみ、MouseLeftButtonUp イベントがトリガーされるため、これは見た目よりも複雑です。
この結果を達成するには、次の 2 つの方法があります。
同じ 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 を、すべてのコントロールを配置したコンテナーの名前に置き換えます)
テストされていませんが、動作する可能性があります。すべての四角形を配置したコンテナーの 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);
}
}
詳細については、私が数か月前に書いたその記事を参照してください。