2016-09-02 26 views
0

I以下の3つのネストされた要素を持っている:PreviewMouseLeftButtonDown のいずれかの方法でWPFイベントバブリングとトンネリング

私はイベントを処理
...

e.Handled = true;を。 KeyUpイベントはまったく発生しません。

コメントアウトすると、すべてが正常に動作します。e.Handled = true;

イベントPreviewMouseLeftButtonDownKeyUpは何とかしていますか?
私は、トンネリング/バブリングのペアリングされたイベント(例えば、PreviewKeyDownKeyDown)が互いに依存していると思っていました。ここで

<DockPanel Name="Level1" PreviewMouseLeftButtonDown="Level1_PreviewMouseLeftButtonDown" 
      KeyUp="Level1_KeyUp"> 
<Grid Name="Level2" PreviewMouseLeftButtonDown="Level2_PreviewMouseLeftButtonDown"                              
      KeyUp="Level2_KeyUp"> 
    <Button Height="25" 
      Width="120" 
      Name="Level3" 
      Content="Button" 
      Click="Level3_Click"     
      PreviewMouseLeftButtonDown="Level3_PreviewMouseLeftButtonDown" 
      KeyUp="Level3_KeyUp"/ >  
</Grid> 
</DockPanel> 

は、イベントの実装です:

private void Level1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    Debug.WriteLine("Level1_PreviewMouseLeftButtonDown"); 
} 

private void Level2_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    Debug.WriteLine("Level2_PreviewMouseLeftButtonDown"); 
     //e.Handled = true; 
} 

private void Level3_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    Debug.WriteLine("Level3_PreviewMouseLeftButtonDown"); 
} 

private void Level3_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.WriteLine("Level3_Click"); 
} 

private void Level3_KeyUp(object sender, KeyEventArgs e) 
{ 
    Debug.WriteLine("Level3_KeyUp"); 
} 

private void Level2_KeyUp(object sender, KeyEventArgs e) 
{ 
    Debug.WriteLine("Level2_KeyUp"); 
} 

private void Level1_KeyUp(object sender, KeyEventArgs e) 
{ 
    Debug.WriteLine("Level1_KeyUp"); 
} 

はなぜ次異なる例で同じように起きていませんか?

<StackPanel PreviewKeyDown="StackPanel_PreviewKeyDown" KeyUp="StackPanel_KeyUp"> 
     <Grid Height="100" PreviewKeyDown="Grid_PreviewKeyDown" KeyUp="Grid_KeyUp"> 
      <Button x:Name="button" Content="Button" Width="100" Height="50" Margin="201,134,216,-84" PreviewKeyDown="button_PreviewKeyDown" KeyUp="button_KeyUp"/> 
     </Grid> 
    </StackPanel> 

イベントの実装:

private void StackPanel_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("StackPanel_PreviewKeyDown " + e.GetHashCode()); 
     e.Handled = true; 
    } 

    private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("Grid_PreviewKeyDown " + e.GetHashCode()); 
    } 

    private void button_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("button_PreviewKeyDown " + e.GetHashCode()); 
    } 

    private void StackPanel_KeyUp(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("StackPanel_KeyUp " + e.GetHashCode()); 
    } 

    private void Grid_KeyUp(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("Grid_KeyUp " + e.GetHashCode()); 
    } 

    private void button_KeyUp(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("button_KeyUp " + e.GetHashCode()); 
    } 

    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("Window_PreviewKeyDown " + e.GetHashCode()); 
    } 

    private void Window_KeyUp(object sender, KeyEventArgs e) 
    { 
     Debug.WriteLine("Window_KeyUp " + e.GetHashCode()); 
    } 

答えて

0

RoutedEventArgsトンネリングおよびバブリングイベントの間で共有されているので、あなたがあなたのトンネリングイベントバブリングを扱うときに実行されることはありません。

MSDNの続きを読む。

+0

次の例では、PreviewKeyDownイベントハンドラでe.Handledとしてマークしても、KeyDown evの実行は抑制されません。ハンドラ。 http://www.codeproject.com/Articles/464926/To-bubble-or-tunnel-basic-WPF-events –

+1

キーevtは、下位コンポーネントで構成されたビジュアルツリーで管理されるためです。 –

関連する問題