我有一个树视图,我在其中向项目容器样式添加了一个事件设置器,以便在鼠标悬停时按下 F1 时捕获。所以在后面的代码中我试图找到鼠标所在的子对象。子对象仅在节点展开并尝试过一次后才在树中找到,每次都正确捕获 key down。所以这只是第二次IsMouseOver
找到子对象。
我已经为目标树禁用了虚拟化,但它没有任何区别。
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="PreviewKeyDown" Handler="EventSetter_OnHandler"></EventSetter>
<Setter Property="IsSelected">
<Setter.Value>
<MultiBinding Mode="OneWay" Converter="{StaticResource ActiveReportTypeMatchToBoolConverter}">
<Binding Path="DataContext.ActiveReportType" ElementName="TreeViewExpander" />
<Binding />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="UIElement.Uid" Value="{Binding Name}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
事件处理程序背后的代码
private void EventSetter_OnHandler(object sender, KeyEventArgs e) {
if (e.Key == Key.F1) {
foreach (var item in TreeViewReportType.Items) {
TreeViewItem anItem = TreeViewReportType.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
if (anItem?.IsMouseOver == true) {
foreach (ReportType childItem in anItem.Items) {
TreeViewItem childTreeViewItem = anItem.ItemContainerGenerator.ContainerFromItem(childItem) as TreeViewItem;
if (childTreeViewItem?.IsMouseOver == true) {
ApplicationCommands.Help.Execute(childItem.HelpId, childTreeViewItem);
}
}
return;
}
}
}
}
你们有谁知道这里的魔术吗?我试图做一个TreeViewReportType.UpdateLayout()
,也anItem.UpdateLayout()
看看它是否做了任何改变。但这没有帮助。
试图查看以前的答案,但它与数据网格相关并且是禁用虚拟化,这在这里不起作用?