2011-08-29 57 views
12

是什麼發件人在WPF事件處理之間的區別?RoutedEventArgs.Source VS發件人

例如,假設我在畫布橢圓形,並且點擊了橢圓:橢圓將兩者發件人

但是,如果橢圓不處理該事件,但主窗口呢,該事件將通過畫布...所以畫布將是活動主窗口的發送將是橢圓。

我有這個權利嗎?

回答

6

泡泡!

發件人是事件正在從升高,而源是導致被觸發事件的原始元素的對象。

如在此情況下:

<TabControl Name="tc1" SelectionChanged="tc1_SelectionChanged"> 
    <TabItem Header="1"> 
     <TabControl Name="tc2"> 
      <TabItem Header="1" /> 
      <TabItem Header="2" /> 
     </TabControl> 
    </TabItem> 
    <TabItem Header="2" /> 
</TabControl> 
private void tc1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
} 

在這種情況下,如果在子TabControl改變SelectedItemsender將等於tc1Source將等於tc2

15

兩者之間的差不是經常看到,隨着通常senderSource是相同的。大多數像Windows Forms一樣編寫的代碼基本上會忽略差異,並將它們作爲相同的參考發送。但是,鑑於WPF的事件路由如何工作,它們代表了兩個不同的概念。

sender is the object at which the event handler was attached。這是提出的處理開始路由事件的所有者。來自MSDN:

發送者和源之間的差異是事件在路由事件通過元素樹遍歷期間被路由到不同元素的結果。

MSDN: Event routing diagram

Source is the object where the event originates.在隧道和冒泡的情況下,Source將是他們的子元素之一。您可以使用OriginalSource屬性剝離任何事件樹封裝。

2

希望這有助於:)

  • RoutedEventArgs.OriginalSource - 對象引發的事件 - 那首募事件
  • RoutedEventArgs.Source原始對象。這通常與OriginalSource相同,但在處理複合控件時,它可以是包含OriginalSource對象的父項。*
  • 發件人 - 正在處理的事件

其中源可以調節包括用於控制內容模型內的內容元素(列表項的內容*一般情況下電流元件,例如,將報告列表項元素作爲源,並且列表項中的實際元素將是原始源)。

參考

4

發信人:電流元件,其處理事件

OriginalSource:原始對象那第一次rai sed事件

來源:引發事件的對象。這通常與OriginalSource相同,但在處理複合控件時,它可以是包含OriginalSource對象的父項。*

RoutedEvent:爲由事件處理程序觸發的事件(例如靜態UIElement)提供RoutedEvent對象。 MouseUpEvent對象)。如果您使用相同的事件處理程序處理不同的事件,則此信息很有用。

處理:允許您暫停事件冒泡或隧道過程。當一個控件將Handled屬性設置爲true時,事件不會再繼續傳遞,也不會爲其他任何元素引發。