WPF事件冒泡和隧道

时间:2016-09-02 07:48:03

标签: wpf events event-bubbling

我有以下3个嵌套元素:

当我处理事件时......

  任何e.Handled = true;中的

PreviewMouseLeftButtonDown   方法。 KeyUp事件根本没有被触发。

当我评论e.Handled = true;时,一切正常。

事件PreviewMouseLeftButtonDownKeyUp是否依赖于某种程度? 我以为只有隧道/冒泡的配对事件(例如 PreviewKeyDown KeyDown )彼此依赖。

<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());
    }

1 个答案:

答案 0 :(得分:0)

RoutedEventArgs在隧道事件和冒泡事件之间共享,因此当您处理隧道事件时,从不执行冒泡。

更多阅读MSDN