2012-09-27 37 views
0

希望有一个简单的问题,因为我正在处理路由事件。停止处理路由事件的控制

我有一个自定义UserControl。这包含许多其他控件。

进一步向上我的树我想响应来自其中一个包含控件(不是我的UserControl)的双击事件。但是,我的UserControl显然会吸引事件并将source属性设置为自己。我怎样才能阻止它这样做?

我不能使用OriginalSource,因为这指向最低级别的控件点击(Border或其他)。

例如。

MyWindow <--- Want to handle double click here with Source = MyContainedControl1 
| 
+-MyUserControl (this is setting Source to itself. How do I turn this off?) 
    | 
    +-MyContainedControl1 
     | 
     Border <---- Mouse double clicks here 
     EditBox 
     Etc 

我试图重写在MyUserControlOnMouseDoubleClick()OnPreviewMouseDoubleClick(),但在这一点上的事件已经有源甚至称基地或任何之前设定为MyUserControl

非常感谢

+0

也许你可以编写一个由MyContainedControl引发的自定义事件,当引发下层元素中的doubleclick事件时。 然后在你的MyWindow中,自定义元素的OriginalSource应该是MyContainedControl1。 – Klaus78

+0

向MyUserControl添加一个将使用EventHandler作为输入的方法。让该方法用MyContainedControl1-X注册处理程序。 – Paparazzi

回答

0

我已经设法解决它通过改变我的UserControlContentControl代替。幸运的是,我的内容都是在运行时动态加载的,所以我不需要UserControl提供的设计时间表面。尽管进行了大量的搜索我找不到WPF偷跑中关于事件的用户控件影响什么,不是一句话其他(页722)

这是因为用户控件相差很少从ContentControl中 基类;它有一个不同的默认控制模板,它在两个方向(而不是 左侧和顶部)默认内容对齐的Stretch的默认内容对齐,默认情况下,它将IsTabStop和Focusable设置为false, 并且它更改所有引发事件的来源从内容到 是UserControl本身

我也不得不改变使用PreviewMouseDown而非MouseDoubleClick,因为MouseDoubleClick是不是一个真正的冒泡事件。见Control.MouseDoubleClick

虽然这个路由事件似乎遵循通过 元素树冒泡的路线,它实际上是沿各的UIElement元素树引发 直接路由事件。

如果我需要UserControl,那么我想我不得不这样做的Klaus78建议和ContainedControl提高我自己的自定义事件,或订阅每个ContainedControl的双击事件手动,而不是让他们冒泡。

1

我只是走可视化树,像这样:

 private void Window_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      var control = FindVisualParent<MyContainedControl1>(e.OriginalSource as DependencyObject); 
      if (control != null) 
      { 
       //magic happens here 
      } 
     } 

     public static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject 
     { 
      var parent = VisualTreeHelper.GetParent(child); 
      if (parent == null) 
       return null; 
      T pT = parent as T; 
      return pT != null ? pT : FindVisualParent<T>(parent); 
     }