2013-12-11 4 views
0

У меня проблема, с которой я не мог найти решение. Вот XAML моей TreeView в:Контекстное меню TreeView появляется на topnode вместо TreeViewItem

<TreeView ItemsSource="{Binding Parents}" ContextMenu="{StaticResource TreeViewContextMenu}"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="{Binding Image}" /> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

И я также получил этот стиль в моем ContentControl.Resources:

<Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> 
     <Setter Property="ContextMenu" Value="{StaticResource TreeViewItemContextMenu}" /> 
    </Style> 

Когда я щелкните правой кнопкой мыши любой элемент, кроме самого первого, то TreeViewItemContextMenu появляется, так же, как предназначена. Но проблема заключается в том, когда я правильно нажимаю topnode, вместо этого появляется TreeViewContextMenu. Я попытался обойтись без TreeViewContextMenu, но тогда у topnode не было ContextMenu.

Я был бы очень рад узнать, что и где я пропустил. Заранее спасибо.

+0

Вы можете попробовать на правый клик названии topnode? Я думаю, что ваш заголовок topnode короток. Я вижу, что вы используете StackPanel. Stackpanel stretch TreeViewItem, и вы можете щелкнуть внешний стек. – ebattulga

+0

Я попытался щелкнуть «TextBlock» и «Image» с тем же результатом: если я правильно щелкнул верхний индекс, «ContextMenu», который появляется неправильно, но если я щелкнул правой кнопкой мыши по любому другому узлу (не имеет значения, правильно ли я правка 'или' TextBlock'), результат будет правильным. Это действительно странно для меня. – Sergey

ответ

1

Я пытаюсь использовать ваш xaml code. Это работы.

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ContextMenu x:Key="TreeViewItemContextMenu"> 
      <MenuItem Header="Item Menu"/> 
     </ContextMenu> 
     <ContextMenu x:Key="TreeViewContextMenu"> 
      <MenuItem Header="Tree Menu"/> 
     </ContextMenu> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> 
      <Setter Property="ContextMenu" Value="{StaticResource TreeViewItemContextMenu}" /> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <TreeView ItemsSource="{Binding Parents}" ContextMenu="{StaticResource TreeViewContextMenu}"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
        <StackPanel Orientation="Horizontal"> 
         <Image Source="{Binding Image}" /> 
         <TextBlock Text="{Binding Name}" /> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 
    </Grid> 
</Window> 

В коде

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      Parents = new ObservableCollection<MyTreeItem>(); 
      var children=new ObservableCollection<MyTreeItem>(); 
      children.Add(new MyTreeItem(){ Name="child1"}); 
      children.Add(new MyTreeItem(){ Name="child2"}); 
      Parents.Add(new MyTreeItem() { Name = "Parent Node", Children = children }); 

      this.DataContext = this; 
     } 

     public ObservableCollection<MyTreeItem> Parents { get; set; } 

    } 

    public class MyTreeItem { 
     public string Name { get; set; } 
     public ObservableCollection<MyTreeItem> Children { get; set; } 
    } 

Когда я нажимаю на верхнем узле и дочернего узла, Контекстное меню такое же

enter image description here

+0

Извините, я ошибся при написании вопроса. Не знаю, нужно ли это, но все это на самом деле не «Окно», а «ContentControl», которое размещено в другом месте. Я отредактировал вопрос. – Sergey

+0

Ну ... что я сделал, я создал новый элемент с тем же кодом, что и раньше. И это работает! Вид волшебства или что-то еще, не знаю. Во всяком случае, спасибо за ответ, это привело меня к тому результату, который мне нужен. – Sergey

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