2012-09-27 77 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); 
     }