c# - 子扩展器引发父扩展器的扩展和折叠事件?

标签 c# wpf events expander

出于某种原因,子级 Expander(放置在另一个 Expander 内的 StackPanel 中)在折叠或展开时会导致父级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>

这是代码隐藏:

    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 上没有改变。

为什么会这样,有什么想法吗?

最佳答案

那些事件在树中被路由和冒泡,如果你想阻止 parent 处理事件并因此对它使用react,请将 e.Handled 设置为 true 在子扩展器的事件处理程序中。

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


(哇,10k...)

关于c# - 子扩展器引发父扩展器的扩展和折叠事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6046731/

相关文章:

c# - 组合框的默认文本

具有多个内容的 WPF 应用程序布局,无需窗口

wpf - RichTextBox Wpf 中的 C# 字符串

c# - 服务栈服务器事件

javascript - 从 JavaScript 中的事件监听器调用访问对象的属性

javascript - JS : Should I set a var/let in a click (or equivalent) event?

c# - LINQ 包含来自字符串数组的一个匹配项

c# - 将泛型类型与 asp.net 用户控件一起使用

c# - 更新 C# 列表中项目的最简单方法

c# - 从局部 View 设置主 url 的路由值