不发生冒泡事件

时间:2009-11-20 18:30:56

标签: c# .net wpf

在下面的代码中,我看到隧道事件发生但没有看到相应的冒泡事件发生。为什么会这样?

谢谢, 戴夫

<Window x:Class="TestRoutedEvents.Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="Window1" Height="300" Width="300"
   PreviewMouseUp="Window_PreviewMouseUp"
   MouseUp="Window_MouseUp">

   <Grid Background="Brown" Margin="30"
         PreviewMouseUp="Grid_PreviewMouseUp"
         MouseUp="Grid_MouseUp">
      <TextBlock Text="Press me" HorizontalAlignment="Center" VerticalAlignment="Center"
         Background="LightGray"
         Padding="3"
         PreviewMouseUp="TextBlock_PreviewMouseUp"
         MouseUp="TextBlock_MouseUp"/>
   </Grid>
</Window>


namespace TestRoutedEvents
{
   /// <summary>
   /// Interaction logic for Window1.xaml
   /// </summary>
   public partial class Window1 : Window
   {
      public Window1()
      {
         InitializeComponent();
      }





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

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

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





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

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

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

3 个答案:

答案 0 :(得分:1)

事实上事件正在提高,但你无法做到。原因是当弹出窗口时,messagbox从窗口获取焦点。因此,路由事件链中的UI元素将不再接收路由事件。

您可以控制窗口并在其中添加事件详细信息以进行确认。 例如在xaml中添加ListBox并将其命名为listBox,然后在每个处理程序中使用此代码

listBox.Items.Add(发件人+ “\ n” 个+ e.RoutedEvent.Name + “\ n” 个+ e.RoutingStrategy);

答案 1 :(得分:0)

这是来自MSDN的引用:

  

TextBox内置了处理功能   冒泡MouseUp和事件。   因此,自定义事件处理程序   听MouseUp或MouseDown   来自TextBox的事件永远不会   调用。如果你需要回复   这些事件,听取隧道   PreviewMouseUp和PreviewMouseDown   而不是事件。

这篇文章是关于TextBox而不是TextBlock,但是我在其他UIElement派生的控件上测试了它,它们似乎都表现得一样。我假设这是在层次结构中的某个基类级别。

How to: Handle MouseUp and MouseDown Events for a TextBox

答案 2 :(得分:0)

我不知道你在尝试做什么,但也许这篇文章会有所帮助。它确认了Anurag所说的内容,关于从您的窗口获得焦点的消息框。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f4d609d4-ba2c-478e-aa53-9ee557ea5165