我有一个像这样定义的WPF TreeView控件:
<TreeView x:Name="samplesTree" MouseDoubleClick="samplesTree_MouseDoubleClick"
KeyUp="samplesTree_KeyUp"
SelectedItemChanged="samplesTree_SelectedItemChanged"
IsVisibleChanged="treeView_IsVisibleChanged">
</TreeView>
我使用以下代码跟踪已展开或折叠的节点:
private List<object> SamplesExpandedTags = new List<object>();
private void stag_Collapsed(object sender, RoutedEventArgs e)
{
object tag = (sender as TreeViewItem).Tag;
if (SamplesExpandedTags.Contains(tag))
SamplesExpandedTags.Remove(tag);
}
private void stag_Expanded(object sender, RoutedEventArgs e)
{
object tag = (sender as TreeViewItem).Tag;
if (!SamplesExpandedTags.Contains(tag))
SamplesExpandedTags.Add(tag);
}
...
// Items are created in code behind, not using binding to DataSource
TreeViewItem item = new TreeViewItem();
item.Header = tv.NazevTypuVyrobku;
item.Tag = string.Format("TV{0}",tv.TypVyrobkuID);
item.Expanded += new RoutedEventHandler(stag_Expanded);
item.Collapsed += new RoutedEventHandler(stag_Collapsed);
通过调试我发现,当子节点正在折叠时,父节点的Collapsed
事件也会触发,因此对于实际折叠节点的整个父元素链运行stag_Collapsed
。
我在stag_Collapsed
方法的开头添加了此代码:
if ((sender as TreeViewItem).IsExpanded) return;
现在代码可以正常工作,但为什么Collapsed事件会触发所有父TreeViewItems,而不仅仅是TreeViewItem实际上正在折叠?我希望IsExpanded
属性在发件人身上始终是false
。
建议的解决方案:
e.Handled = true;
不是防弹,因为这段代码:
subitem.Expanded += new RoutedEventHandler(stag_Expanded);
subitem.Expanded += new RoutedEventHandler(sampleOperation_Expanded);
subitem.Collapsed += new RoutedEventHandler(stag_Collapsed);
与此代码的工作方式不同:
subitem.Expanded += new RoutedEventHandler(sampleOperation_Expanded);
subitem.Expanded += new RoutedEventHandler(stag_Expanded);
subitem.Collapsed += new RoutedEventHandler(stag_Collapsed);
在第一种情况下,由于sampleOperation_Expanded
命令,e.Handled = true;
根本没有执行。
我认为that order of event handler execution不应该很重要吗?
答案 0 :(得分:4)
也许尝试在你的stag_Collapsed()方法中将e.Handled设置为true。每MSDN,&#34;标记处理的事件将限制路由事件在事件路径上对侦听器的可见性&#34;。
private void stag_Collapsed(object sender, RoutedEventArgs e)
{
object tag = (sender as TreeViewItem).Tag;
if (SamplesExpandedTags.Contains(tag))
SamplesExpandedTags.Remove(tag);
e.Handled = true;
}