gpt4 book ai didi

c# - Collapsed 事件在 TreeViewItem 的父节点上触发

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:16 24 4
gpt4 key购买 nike

我有一个这样定义的 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 事件会在所有父 TreeViewItem 上触发,而不仅仅是在实际折叠的 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);

在第一种情况下,由于 e.Handled = true; 命令,sampleOperation_Expanded 根本没有执行。我以为that order of event handler execution应该不显着吧?

最佳答案

也许尝试在您的 stag_Collapsed() 方法中将 e.Handled 设置为 true。每MSDN , "标记已处理的事件将限制路由事件对沿事件路由的监听器的可见性"。

private void stag_Collapsed(object sender, RoutedEventArgs e)
{
object tag = (sender as TreeViewItem).Tag;
if (SamplesExpandedTags.Contains(tag))
SamplesExpandedTags.Remove(tag);
e.Handled = true;
}

关于c# - Collapsed 事件在 TreeViewItem 的父节点上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36284213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com