首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF TreeView - TreeViewItem上的上下文菜单没有出现

WPF TreeView - TreeViewItem上的上下文菜单没有出现
EN

Stack Overflow用户
提问于 2013-09-11 10:11:46
回答 1查看 1.7K关注 0票数 0

我有一个带有TreeView的用户控件,根据输入HierarchicalDataTemplate的结构,节点是直接生成的(实际上,我使用了HierarchicalDataTemplate属性)。如果单击单个节点上的左侧按钮,XML的该部分的内容将显示在单独的用户控件上。通过TreeViewItem的属性标头可视化单个节点。

我想补充的是,一个具有正确按钮的逻辑,它简单地显示了一个上下文菜单,在这个节点上只有几个命令。

我在网上搜索了一些资料(因为我对WPF非常陌生),并且首先尝试定义一个上下文菜单.

第一解决方案XAML:

代码语言:javascript
运行
复制
<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>

代码隐藏:

代码语言:javascript
运行
复制
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之外定义一个上下文菜单:

代码语言:javascript
运行
复制
<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:

代码语言:javascript
运行
复制
private void MenuClick()
{
    this.contextMenuTreeViewItem.IsOpen = true;
    this.contextMenuTreeViewItem.IsEnabled = true;
    this.menuItemCopy.IsEnabled = true;
    this.contextMenuTreeViewItem.StaysOpen = true;
}

我肯定我做错了什么,但是我不能说precisely...plus,我看到了如何使用属性ContextMenu作为一个设置器Property...and,我不能理解这种方法的不同之处。

提前找你帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-24 08:41:36

是在几年后才出现的,但考虑到没有人给出答案,也许有人会从中受益。对我起作用的是在TreeView.Resources部分中定义一个上下文菜单,并给它一个标识的关键,如下所示:

代码语言:javascript
运行
复制
        <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上设置了上下文菜单):

代码语言:javascript
运行
复制
        <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>

完整的代码如下:

代码语言:javascript
运行
复制
<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。我希望这能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18738356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档