C# · 12月 27, 2021

c# – 儿童扩展者提升父母扩展者的扩展和崩溃事件?

出于某种原因,子展开器(置于另一个Expander内的StackPanel中)在折叠或展开时会导致父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) { Message@R_79_2419@.Show(“expanded”); } private void Expander_Collapsed(object sender,RoutedEventArgs e) { Message@R_79_2419@.Show(“collapsed”); }

当您运行此操作时,如果展开父级,则会获得“扩展”消息框,正如您所期望的那样.但是当你然后展开其中一个孩子时,你会再次收到消息框.

扩展活动的documentation说:

The Expanded event occurs when the IsExpanded property changes from false to true

但显然IsExpanded属性在父Expander上没有变化.

为什么会发生这种情况,有什么想法吗?

解决方法 这些事件在树中被路由并冒泡,如果你想阻止父母处理事件并因此对它作出反应,在子扩展器的事件处理程序中将e.Handled设置为true.

编辑:除了阻止事件被引发之外,您还可以将处理程序中的代码执行限制为附加处理程序的实际扩展器引发事件的情况.您可以通过将所有内容包装在if-block中来执行此操作,该if-block如果sender == e.OriginalSource则执行.

(哇,10k ……)