重用上下文菜单

时间:2013-05-19 06:12:35

标签: c# wpf contextmenu

我创建了一个上下文菜单,我(目前)用于树视图中的某些项目。为此我创建了一个TreeItem类,它包含所有相关信息,如标题,图标,子项,执行目标等。这就是它的样子:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
             Visibility="{Binding ShowContextMenu}"
             ItemsSource="{Binding ContextMenu}">
  <ContextMenu.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
      <TextBlock Text="{Binding Header}" />
      <HierarchicalDataTemplate.ItemContainerStyle>
        <Style TargetType="MenuItem">
          <Setter Property="Command"
                  Value="{Binding Execute}" />
          <Setter Property="Icon"
                  Value="{StaticResource cmIcon}" />
          <Setter Property="ToolTip"
                  Value="{Binding ToolTip}" />
        </Style>
      </HierarchicalDataTemplate.ItemContainerStyle>
    </HierarchicalDataTemplate>
  </ContextMenu.ItemTemplate>
  <ContextMenu.ItemContainerStyle>
    <Style TargetType="MenuItem">
      <Setter Property="Command"
              Value="{Binding Execute}" />
      <Setter Property="Icon"
              Value="{StaticResource cmIcon}" />
      <Setter Property="ToolTip"
              Value="{Binding ToolTip}" />
    </Style>
  </ContextMenu.ItemContainerStyle>
</ContextMenu>

当我仅在树视图中使用上下文菜单时,它被附加到ItemTemplate中的TextBlock。但是现在我想为不同的控件使用相同的上下文菜单。由于我不想将相同的代码复制到不同的位置并多次维护,我想将其重用为模板。我尝试了两件事:

  • 我将上下文菜单放在用户控件的资源中(仅用于测试),并将其调用为:<TextBlock Text="{Binding Header}" ContextMenu="{StaticResource myContextMenu}">。它将被显示,但不会被关闭而不会移动。此外,这也不是很有用,因为我想在不同的用户控件上使用上下文菜单。

  • 然后我将上下文菜单放在App.xaml中的控件模板中:<ControlTemplate x:Key="TreeContextMenu" TargetType="ContextMenu">。我称之为:

    <TextBlock.ContextMenu>
        <ContextMenu Template="{StaticResource TreeContextMenu}"/>
    </TextBlock.ContextMenu>
    

程序启动,但是当我想打开上下文菜单时,我得到一个例外:'ContextMenu' cannot have a logical or visual parent.

我试图谷歌寻求解决方案,但找不到任何有用的东西。

1 个答案:

答案 0 :(得分:1)

您正尝试在上下文菜单中创建上下文菜单。从App.xaml中删除ControlTemplate标记,并将x:Key属性直接移至ContextMenu标记。

此外,删除TextBlock.ContextMenu并将ContextMenu="{StaticResource TreeContextMenu}"属性添加到TextBlock标记。