我有一个带有TreeView的用户控件,根据输入HierarchicalDataTemplate的结构,节点是直接生成的(实际上,我使用了HierarchicalDataTemplate属性)。如果单击单个节点上的左侧按钮,XML的该部分的内容将显示在单独的用户控件上。通过TreeViewItem的属性标头可视化单个节点。
我想补充的是,一个具有正确按钮的逻辑,它简单地显示了一个上下文菜单,在这个节点上只有几个命令。
我在网上搜索了一些资料(因为我对WPF非常陌生),并且首先尝试定义一个上下文菜单.
第一解决方案XAML:
<TreeView x:Name="treeViewStruttura" Panel.ZIndex="1" HorizontalAlignment="Left" VerticalContentAlignment="Top" Width="200" Height="Auto">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<HierarchicalDataTemplate.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnTreeNodeMouseClick" />
<EventSetter Event="PreviewMouseRightButtonDown" Handler="OnTreeNodeMouseRightClick"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="LightGray" />
</Trigger>
</Style.Triggers>
<Style.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="4"/>
<Setter Property="BorderThickness" Value="4"/>
</Style>
</Style.Resources>
</Style>
</HierarchicalDataTemplate.Resources>
<TreeViewItem Header="{Binding Text}" x:Name="treeViewItem" HorizontalAlignment="Left" HorizontalContentAlignment="Left"
BorderThickness="2">
<TreeViewItem.ContextMenu>
<ContextMenu IsEnabled="True" IsOpen="True" >
<MenuItem Command="ModificaArticolo" />
<MenuItem x:Name="menuItemCopy" Header="Copy" Command="Copy" Tag="0"/>
</ContextMenu>
</TreeViewItem.ContextMenu>
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>代码隐藏:
public partial class DocumentView : UserControl
{
public DocumentView()
{
InitializeComponent();
PreviewMouseRightButtonDown += DocumentView_PreviewMouseRightButtonDown;
}
void DocumentView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
MenuClick();
}
private void MenuClick()
{
ContextMenu menu = new ContextMenu();
var copyMenuItem = new MenuItem();
copyMenuItem.Command = System.Windows.Input.ApplicationCommands.Copy;
copyMenuItem.Header = "Copy";
menu.Items.Add(copyMenuItem);
menu.Visibility = System.Windows.Visibility.Visible;
menu.IsEnabled = true;
menu.IsOpen = true;
menu.Focusable = true;
}
}第二个解决方案,我尝试在XAML TreeView之外定义一个上下文菜单:
<ContextMenuService.ContextMenu>
<ContextMenu x:Name="contextMenuTreeViewItem">
<Style TargetType="{x:Type TreeViewItem}" >
</Style>
<MenuItem x:Name="menuItemCopy" Header="Copy" Command="Copy" Tag="0"/>
</ContextMenu>
</ContextMenuService.ContextMenu>CodeBehind:
private void MenuClick()
{
this.contextMenuTreeViewItem.IsOpen = true;
this.contextMenuTreeViewItem.IsEnabled = true;
this.menuItemCopy.IsEnabled = true;
this.contextMenuTreeViewItem.StaysOpen = true;
}我肯定我做错了什么,但是我不能说precisely...plus,我看到了如何使用属性ContextMenu作为一个设置器Property...and,我不能理解这种方法的不同之处。
提前找你帮忙。
发布于 2019-04-24 08:41:36
是在几年后才出现的,但考虑到没有人给出答案,也许有人会从中受益。对我起作用的是在TreeView.Resources部分中定义一个上下文菜单,并给它一个标识的关键,如下所示:
<TreeView.Resources>
<ContextMenu x:Key="ChildContextMenu">
<MenuItem Header="View"/>
<MenuItem Header="Edit"/>
<MenuItem Header="Print"/>
<MenuItem Header="Delete"/>
<MenuItem Header="Batch actions">
<MenuItem Header="View all"/>
<MenuItem Header="Edit all"/>
<MenuItem Header="Print all"/>
<MenuItem Header="Delete all"/>
</MenuItem>
</ContextMenu>
</TreeView.Resources>然后,可以将上面的上下文菜单附加到用作TreeViewItem的任何控件,如下所示(在这里,我在TextBlock上设置了上下文菜单):
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Sample}" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Parent}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}" ContextMenu="{StaticResource ChildContextMenu}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>完整的代码如下:
<TreeView>
<TreeView.Resources>
<ContextMenu x:Key="ChildContextMenu">
<MenuItem Header="View"/>
<MenuItem Header="Edit"/>
<MenuItem Header="Print"/>
<MenuItem Header="Delete"/>
<MenuItem Header="Batch actions">
<MenuItem Header="View all"/>
<MenuItem Header="Edit all"/>
<MenuItem Header="Print all"/>
<MenuItem Header="Delete all"/>
</MenuItem>
</ContextMenu>
</TreeView.Resources>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Sample}" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Parent}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}" ContextMenu="{StaticResource ChildContextMenu}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>处理单击的逻辑可以以各种方式附加,其中之一是每个MenuItem。我希望这能帮到你。
https://stackoverflow.com/questions/18738356
复制相似问题