出于某种原因,子级 Expander
(放置在另一个 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 上没有改变。
为什么会这样,有什么想法吗?
最佳答案
那些事件在树中被路由和冒泡,如果你想阻止 parent 处理事件并因此对它使用react,请将 e.Handled
设置为 true
在子扩展器的事件处理程序中。
编辑:除了阻止引发事件之外,您还可以将处理程序中的代码执行限制为附加处理程序的实际扩展器引发事件的情况。您可以通过将所有内容包装在一个 if
block 中来实现,该 block 在 sender == e.OriginalSource
时执行。
(哇,10k...)
关于c# - 子扩展器引发父扩展器的扩展和折叠事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6046731/