2

我创建了一个上下文菜单,我(目前)将其用于树视图中的某些项目。为此,我创建了一个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.

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

4

1 回答 1

1

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

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

于 2013-05-19T07:05:14.767 回答