2013-05-19 4 views
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> 

Когда я использовал контекстное меню только в дереве view, он был прикреплен к TextBlock в ItemTemplate. Но теперь я хочу использовать одно и то же контекстное меню для другого элемента управления. Поскольку я не хочу копировать один и тот же код в другое место и поддерживать его несколько раз, я хочу повторно использовать его в качестве шаблона. Я попробовал 2 вещи:

  • Я положил контекстное меню ресурсов пользовательского элемента управления (только для тестирования) и назовем это так: <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.

Я пытался Google для решения, но не нашел ничего полезного.

ответ

1

Вы пытаетесь создать контекстное меню внутри контекстного меню. Удалите тег ControlTemplate из App.xaml и переместите атрибут x:Key непосредственно в тег ContextMenu.

Также удалите TextBlock.ContextMenu и добавьте атрибут ContextMenu="{StaticResource TreeContextMenu}" к тегу TextBlock.

+0

Но у меня все еще есть та же проблема, что и контекстное меню не будет закрываться снова. Это можно устранить, если я удалю атрибут «Видимость». Однако я хочу скрыть все контекстное меню, если оно не содержит никаких элементов. – Peter

+0

Привязка контекстного меню к TreeViewItem вместо текстового блока должно решить вашу проблему. – Jan

Смежные вопросы