儿童扩张者提升父母扩张者的扩张和倒塌事件?

Tim*_*Tim 6 c# wpf events expander

出于某种原因,当折叠或扩展时,子项Expander(放置在StackPanel另一个内部Expander)导致父Expander提升其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>
Run Code Online (Sandbox Code Playgroud)

这是代码隐藏:

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

    private void Expander_Collapsed(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("collapsed");
    }
Run Code Online (Sandbox Code Playgroud)

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

Expanded活动的文档说:

当IsExpanded属性从false更改为true时,会发生Expanded事件

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

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

H.B*_*.B. 12

这些事件路由和气泡爬在树上,如果你想阻止父母从处理事件,从而被动应付,设置e.Handledtrue在孩子扩展的事件处理程序.

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


(哇,10k ......)