10

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

 <StackPanel MouseEnter="StackPanel_MouseEnter" Height="130" Background="Blue">
    <Grid MouseEnter="Grid_MouseEnter" Height="60" Background="Red" >
       <Button MouseEnter="Button_MouseEnter" Height="20"/>
    </Grid>
 </StackPanel>

背後のコードで私はこれをやっています

private void StackPanel_MouseEnter(object sender, MouseEventArgs e)
{

}

private void Grid_MouseEnter(object sender, MouseEventArgs e)
{
    e.Handled = true;
}

private void Button_MouseEnter(object sender, MouseEventArgs e)
{   
    e.Handled = true;
}

これで、マウスを上に移動しButtonて設定しても、とe.Handled = trueのイベントがそれぞれ呼び出されます。なんで?ルーティングされたイベントがバブリングするのを防ぐにはどうすればよいですか?GridStackPanel

4

1 に答える 1

11

MouseEnterイベントはバブリングイベントではなく、直接イベントです(従来のCLRイベントのように)。ドキュメントから:

XAMLコンテンツのオブジェクトに対して複数のMouseEnterイベントを定義できます。ただし、子オブジェクトとその親オブジェクトの両方がMouseEnterイベントを定義している場合、親オブジェクトのMouseEnterイベントは、子オブジェクトのMouseEnterイベントの前に発生します。これはバブリングイベントの場合ではありません。これは、マウス(またはスタイラス)が両方のオブジェクトに入ったことを示しているだけであり、ビジュアルツリーのレイアウトと構成に応じて異なる時間になる可能性があります。

だからあなたはそれが両親に解雇されるのを防ぐことはできません。IsMouseDirectlyOverプロパティを使用して、マウスが実際に指定された要素の上にのみあるかどうかを確認できます。

于 2011-06-09T17:34:52.493 に答える