2

XAMLコードがあります:

<Canvas x:Name="mainCanvas" Width="200" Height="150" Background="LightGray"
        MouseLeftButtonUp="mainCanvas_MouseLeftButtonUp"
        MouseMove="mainCanvas_MouseMove">
    <Canvas x:Name="topCanvas" Width="200" Height="100" Background="LightBlue"
            MouseLeftButtonUp="topCanvas_MouseLeftButtonUp"
            MouseMove="topCanvas_MouseMove">
    </Canvas>
</Canvas>

とその背後にあるコード:

private void topCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("topCanvas_MouseLeftButtonUp");

    e.Handled = true; // This can prevent routing to the mainCanvas
}

private void mainCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("mainCanvas_MouseLeftButtonUp");
}

private void topCanvas_MouseMove(object sender, MouseEventArgs e)
{
    Debug.WriteLine("topCanvas_MouseMove");

    // How to prevent routing to the mainCanvas?
    // e.Handled = true does NOT exist in MouseEventArgs
}

private void mainCanvas_MouseMove(object sender, MouseEventArgs e)
{
    Debug.WriteLine("mainCanvas_MouseMove");
}

私の質問はすでにコメントにあります。

MouseMoveイベントがtopCanvas(子キャンバス)からmainCanvas(親キャンバス)にルーティングされないようにするにはどうすればよいですか?

ありがとう。

ピーター

4

3 に答える 3

0

Canvas の IsHitTestVisible プロパティを設定してみてください。そのプロパティを適切に設定すると、マウスイベントはコントロールを「通過」するか、コントロールによってキャッチされます。

これがあなたが必要とするものであることを願っています。

于 2012-01-16T06:44:19.603 に答える
0

mainCanvas の MouseMove イベントで e.OriginalSource を比較してみて、mainCanvas から発生していない場合は Sub を終了できます。

private void mainCanvas_MouseMove(object sender, MouseEventArgs e)
{
    if (sender != e.OriginalSource)
        return;        
}

コメントへの返信として、もう少し詳しく。UIElement.MouseMove Event MSDN リンクによると。

MouseMove を継承するコントロールは、OnMouseMove メソッドをオーバーライドすることにより、すべてのインスタンスのハンドラーとして機能するイベントの処理を提供できます。イベントの直接処理と同様に、利用可能な Handled プロパティがないため、Handled 手法によるイベントのさらなる処理を抑制するような方法で OnMouseMove を実装することはできません。

このリンクには次のように記載されています。

このイベントは、このクラスの Mouse.MouseMove 添付イベントのエイリアスを作成します

これにより、 AttachedEventsのこのリンクが表示されます。

Extensible Application Markup Language (XAML) は、言語コンポーネントと、添付イベントと呼ばれるイベントの種類を定義します。添付イベントの概念により、特定のイベントのハンドラーを、実際にイベントを定義または継承する要素ではなく、任意の要素に追加できます。この場合、イベントを発生させる可能性のあるオブジェクトも、宛先処理インスタンスもイベントを定義または「所有」しません。

私が見ているように、あなたの唯一の選択肢はそれを回避することです。

于 2012-01-16T06:34:39.160 に答える
-2

この機能は「イベントバブリング」と呼ばれます。以下のコードを使用して停止できます。

jQuery:event.stopPropagation(); 参照:http ://api.jquery.com/event.stopPropagation/

以下のコードを試すこともできます:e.stopPropagation(); //イベントがバブリングするのを防ぐためe.preventDefault(); //次にイベントをキャンセルします(キャンセル可能な場合)

Ref: http://stackoverflow.com/questions/1967537/how-to-stop-event-bubbling-with-jquery-live

ありがとう、Ravi Verma

于 2012-01-16T05:54:49.230 に答える