2013-12-11 15 views
0

我有一個問題,我找不到解決方案。這裏是我的TreeView的XAML:TreeView的contextmenu出現在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拉伸TreeViewItem,你可以點擊外面的stackpanel。 – ebattulga

+0

我嘗試了右鍵單擊'TextBlock'和'Image'獲得相同的結果:如果我右擊頂部節點,出現的'ContextMenu'是錯誤的,但是如果我右鍵點擊任何其他節點(如果我右擊'Image '或'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

對不起,我在寫問題時犯了一個錯誤。不知道是否有必要,但整個事情實際上不是'Window',而是放在其他地方的'ContentControl'。我編輯了這個問題。 – Sergey

+0

那麼......我所做的是我使用與之前相同的代碼創建了新項目。它的工作原理!有點神奇的東西,不知道。無論如何,謝謝你的回答,它使我得到了我需要的結果。 – Sergey

相關問題