出于某种原因,当孩子Expander
(放置在另一个StackPanel
内的Expander
内)时,折叠或展开时会导致父Expander提升其Expanded
或Collapsed
事件。
任何人都知道这是为什么或我如何改变它?我只对父母的事件感兴趣。
以下是一些测试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");
}
运行此操作时,如果展开父级,则会获得“扩展”消息框,正如您所期望的那样。但是当你随后扩展其中一个孩子时,你会再次收到消息框。
Expanded事件的documentation说:
当IsExpanded属性从false更改为true
时,会发生Expanded事件
但显然IsExpanded属性在父Expander上没有变化。
为什么会发生这种情况,有什么想法?
答案 0 :(得分:12)
这些事件在树中被路由并冒泡,如果您想阻止父母处理事件并因此对其做出反应,请在子扩展器的事件处理程序中将e.Handled
设置为true
。
编辑:除了阻止事件被引发之外,您还可以将处理程序中的代码执行限制为附加处理程序的实际扩展器引发事件的情况。您可以通过将所有内容包装在if
- 块中来执行此操作,该块在sender == e.OriginalSource
时执行。
( Woo,10k ...... )