在 WPF 中,如何通过右键单击选择光标下的树视图项?
在 WPF 中,当我右键单击树视图项时,我希望在显示上下文菜单之前选择/激活它。
这听起来很简单,但是包含 hierachicalDataTemplate 使事情变得有点复杂。
我有以下树视图:
<TreeView
x:Name="trv"
ContextMenu="{StaticResource contextMenu}"
ItemTemplate="{StaticResource treeHierarchicalDataTemplate}"
ItemsSource="{Binding Source={StaticResource meetingItems}}" >
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="trv_PreviewMouseRightButtonDown"/>
<Setter Property="IsExpanded" Value="True"></Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
这是我的事件处理程序...
private void trv_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
TreeViewItem item = sender as TreeViewItem;
if (item != null)
{
item.Focus();
e.Handled = true;
}
}
请注意我如何在上面添加 EventSetter。 这几乎有效。 但它只选择根级树视图节点(即我右键单击的节点的根父级)。 这可能是因为我的分层数据模板? 该模板可以包含相同类型的子模板。
这是我的分层数据模板...
<HierarchicalDataTemplate x:Key="treeHierarchicalDataTemplate"
ItemsSource="{Binding Path=ChildMeetingItems}">
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Red}" Value="True">
<Setter TargetName="img" Property="Image.Source" Value="pack://siteoforigin:,,,/images/bookRed.png"></Setter>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
<StackPanel
x:Name="treeViewItemPanel"
Background="Transparent"
Orientation="Horizontal">
<Image Width="16" Height="16" x:Name="img" Margin="0,0,4,0" Source="pack://siteoforigin:,,,/images/bookGreen.png"></Image>
<TextBlock Foreground="DarkGray" Text="{Binding DisplayIndex}" Margin="0,0,5,0"></TextBlock>
<TextBlock Text="{Binding Summary}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
知道为什么右键单击时只选择根节点而不是子节点吗?
In WPF, when I right-click on a treeview item I would like it to be Selected/Activated before showing the context menu.
This sounds pretty simple, but the inclusion of a hierachicalDataTemplate complicates things a little.
I have the following treeview:
<TreeView
x:Name="trv"
ContextMenu="{StaticResource contextMenu}"
ItemTemplate="{StaticResource treeHierarchicalDataTemplate}"
ItemsSource="{Binding Source={StaticResource meetingItems}}" >
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="trv_PreviewMouseRightButtonDown"/>
<Setter Property="IsExpanded" Value="True"></Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
And here is my event handler...
private void trv_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
TreeViewItem item = sender as TreeViewItem;
if (item != null)
{
item.Focus();
e.Handled = true;
}
}
Note how I add an EventSetter above. This ALMOST works. But it only selects the root-level treeview node (i.e. the root parent of the node on which I right click). This may be because of my hierarchical data template? This template can contain children OF THE SAME TYPE.
Here is my hierarchical data template...
<HierarchicalDataTemplate x:Key="treeHierarchicalDataTemplate"
ItemsSource="{Binding Path=ChildMeetingItems}">
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Red}" Value="True">
<Setter TargetName="img" Property="Image.Source" Value="pack://siteoforigin:,,,/images/bookRed.png"></Setter>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
<StackPanel
x:Name="treeViewItemPanel"
Background="Transparent"
Orientation="Horizontal">
<Image Width="16" Height="16" x:Name="img" Margin="0,0,4,0" Source="pack://siteoforigin:,,,/images/bookGreen.png"></Image>
<TextBlock Foreground="DarkGray" Text="{Binding DisplayIndex}" Margin="0,0,5,0"></TextBlock>
<TextBlock Text="{Binding Summary}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
Any idea on why only the root node instead of child nodes are selected when I right-click?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是因为子节点不会继承 ItemContainerStyle。
您需要在 HierarchicalDataTemplate 的 ItemContainerStyle 上添加相同的 EventSetter。
That's because the ItemContainerStyle is not inherited by the child nodes.
You need to add the same EventSetter on the ItemContainerStyle o your HierarchicalDataTemplate.
只需在事件处理程序中注释
e.Handler=true
即可。像这样:
just comment the
e.Handler=true
from your event handler.like this:
我遇到了同样的问题 - 无法获得正确选择的树项目。 我没有使用
PreviewMouseRightButtonDown
事件,而是使用StackPanel
的相同事件,该事件还存储所有需要的数据:以及事件处理程序代码隐藏:
MyTreeViewItem
是我的数据自定义类型;myClicked
现在存储与单击的树项目关联的数据。希望它能帮助像我这样的人。
I had the same problem - couldn't get the proper selected tree item. And instead of using
PreviewMouseRightButtonDown
event I used same event of aStackPanel
which also stores all needful data:And the event handler code-behind:
MyTreeViewItem
is my custom type for a data;myClicked
now stores a data associated with the clicked tree item.Hope it will help someone like me.