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)
    {
        MessageBox.Show("expanded");
    }

    private void Expander_Collapsed(object sender,RoutedEventArgs e)
    {
        MessageBox.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 ……)

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么