2010-09-13 94 views
1

我實現了UserControl。然後,我想要處理最初由Window(鍵盤按下)處理的事件。路由由另一個組件捕獲的事件的最佳方式是什麼(組件樹中的較高組件)?WPF中的事件路由

在此先感謝您的回覆和提示!

乾杯

回答

1

這取決於您嘗試訪問的事件。如果它是預覽事件,並且窗口將e.Handled設置爲true,則需要使用Alex建議的方法來規避窗口對隧道的處理。如果它是一個冒泡事件(即KeyDown),你不需要做任何特殊的事情,因爲冒泡事件首先觸擊子元素的處理器,然後上到可視化樹中,這樣窗口處理器將不會出現在你的UC之後。

使用Key事件時需要注意的一件事是,如果焦點在其上或內部,該事件將首先由UC取得。這不是你需要擔心的事情,比如鼠標事件,因爲它們從樹中的特定位置開始。

0

我相信你不能保證。 Window類正在封裝基於Win32消息的事件模型,並且這將是唯一可以訪問這些信息的WPF實體。

我建議您創建一個附加屬性(將由Window使用)並自行實現事件的路由,以便控件可以訂閱。

0

您可以將這些路由處理程序指定要處理處理的消息,以及:

this.AddHandler(routedEvent, handler, true); 

其中this是的UIElement或派生類。

然而,仍然可能有事件(​​在這種情況下按鍵),它不會超過窗口,不知道。

+0

如果上面的某個控件停止冒泡,這將不起作用。因此「不能保證」 – Aliostad 2010-09-13 11:38:05

+1

其實,控制器究竟能夠如何停止冒泡?設置Handled = true不會停止它,只會將其標記爲已處理。 – 2010-09-13 12:12:31