2011-05-18 148 views
6

由於某種原因,子項Expander(置於另一個Expander內部的StackPanel中)在摺疊或展開時會導致父級擴展器提高其ExpandedCollapsed事件。兒童擴展器提升父母擴展器的擴展和摺疊事件?

任何人都知道爲什麼這是或如何改變它?我只對父母的事件感興趣。

下面是一些測試XAML:

<Expander Header="Outer" Expanded="Expander_Expanded" Collapsed="Expander_Collapsed"> 
     <StackPanel> 
      <Expander Header="Inner1"> 
       <Canvas Height="100" Width="100" Background="Blue" /> 
      </Expander> 
      <Expander Header="Inner2"> 
       <Canvas Height="100" Width="100" Background="Red" /> 
      </Expander> 
     </StackPanel> 
    </Expander> 

,這裏是後臺代碼:

private void Expander_Expanded(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("expanded"); 
    } 

    private void Expander_Collapsed(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("collapsed"); 
    } 

當你運行這個,如果你展開父,你會得到一個「擴大「messagebox,如你所期望的那樣。但是當你展開其中一個孩子時,你會再次看到消息框。

documentation爲擴大事件說:

當從假IsExpanded屬性更改爲true

但顯然IsExpanded屬性未在父擴展變化發生的事件展開。

爲什麼會發生這種情況,有什麼想法?

回答

11

如果您想阻止父母處理事件並對其作出反應,那麼在子級擴展器的事件處理程序中將e.Handled設置爲true,這些事件將在樹中路由並冒泡。

編輯:而不是阻止引發事件,您也可以將處理程序中的代碼執行限制爲當處理程序所在的實際擴展程序引發事件時的情況。您可以通過將所有內容都包含在if - 如果sender == e.OriginalSource執行的塊中來執行此操作。


嗚,10K ...

+0

啊確定。我沒有意識到這種類型的事件會以這種方式獲得路由。對於鼠標/鍵盤的相互作用,當它實際上影響到父母時也是有意義的......但是擴展似乎是一種奇怪的選擇。感謝您的迴應,H.B. – Tim 2011-05-18 15:05:24

+0

事實上,我曾經以編程方式創建了一個由擴展器組成的樹,並且由於這個原因,孩子們不會像預期的那樣擴展。 – 2011-05-18 15:06:32

+0

哈哈。我相信這很令人沮喪(就像這樣)。恭喜10k。我正努力在那裏工作! – Tim 2011-05-18 15:07:29