在TreeViewItem

时间:2016-03-29 12:24:47

标签: c# wpf treeview

我有一个像这样定义的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不应该很重要吗?

1 个答案:

答案 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;
}