我一直在尋找事件的描述「預覽******」就像每個元素都有事件KeyDown和PreviewKeyDown。有什麼區別(不是一個是附加事件,一個不是,真正的傳統差異和編程方式的差異)什麼是WPF預覽事件?
在派生自Control的任何類中,您都可以重寫這兩種方法.. OnKeyDown和OnPreviewKeyDown,現在我寫我的自定義控件,我應該使用哪種方法?兩者之間有什麼區別。
我一直在尋找事件的描述「預覽******」就像每個元素都有事件KeyDown和PreviewKeyDown。有什麼區別(不是一個是附加事件,一個不是,真正的傳統差異和編程方式的差異)什麼是WPF預覽事件?
在派生自Control的任何類中,您都可以重寫這兩種方法.. OnKeyDown和OnPreviewKeyDown,現在我寫我的自定義控件,我應該使用哪種方法?兩者之間有什麼區別。
從編程WPF克里斯 - 塞爾斯和伊恩·格里菲斯
在直接的事件外, WPF定義 對大多數路由事件 - 一個隧道和其他 冒泡。隧道事件名稱 總是以「預覽」開頭,並且首先會提出 。這讓父母在 到達孩子之前有機會看到事件。其次是 冒泡的對手。在大多數 的情況下,你將只處理冒泡之一 。預覽會 通常用來
- 塊的事件(
e.Handled = true
)- 引起家長做一些提前到正常的事件處理。
例如,如果UI樹=按鈕包含網格包含畫布包含橢圓
點擊橢圓會導致(MouseDownButton被巴頓吃掉,然後點擊改爲引發。)
PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid
基本上,它是相同的事件,但發生在主要事件之前。它們存在,因此您可以在發生這些事件時監聽這些類型的事件而不會干擾控件的正常行爲。
例如,按鈕做的事情時,你如果你處理這些自己,你必須確保你做同樣的事情,否則你的按鈕將不會採取同樣的事件點擊或的MouseEnter等。預覽事件可以在同一時間線上爲您提供一個事件,而不必擔心會混淆現有的功能。
這在處理自定義樣式/觸發器/控件模板時特別有用。當你開始重寫控制外觀/行爲。
所以在你的控制,做你想做的主要工作在onKeyDown事件,離開他人使用預覽事件,是我與他們合作。
我發現這個博客條目真正有用的在描述的區別:
http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/
你有可視化樹,當事件在樹中的元素時,先預覽事件將從旅行根元素(隧道):將在所有這些元素上引發PreviewKeyDown事件,然後「正常」事件將從元素傳播到根(冒泡)。
這個區別與路由事件有關,這是WPF實現其事件處理策略的方式。標準事件名稱(即KeyDown等)意味着冒泡路由策略。以「預覽」(即PreviewKeyDown等)作爲前綴的那些意味着隧道路由策略。您可以更詳細地閱讀這些策略here。基本上,當WPF中的事件被調用時,它首先從視覺樹中最頂端的元素到調用該事件的元素,最後返回向上。在沿着樹的路上,您將遇到PreviewKeyDown事件,並且在回程中您將按照該順序遇到KeyDown事件。
謝謝,我一直在MSDN找遍,但沒有找到它,我讀到每個人都在談論冒泡和隧道,但是這個文本在任何地方都失蹤了。 – 2009-09-22 14:27:24