2013-07-03 5 views
0

У меня есть небольшая проблема с указанием ContextMenu для конкретного TreeViewItem:TreeViewItems и ContextMenu

<TreeView x:Name="_filesTree"> 
    <TreeView.Resources> 
     <ContextMenu x:Key="_rootContextMenu"> 
      <MenuItem Header="Add..." Click="MenuItem_Click" /> 
     </ContextMenu> 
    </TreeView.Resources> 
    <TreeViewItem Header="Persistent" ContextMenu="{DynamicResource _rootContextMenu}"/> 
    <TreeViewItem Header="Temporary" ContextMenu="{DynamicResource _rootContextMenu}" /> 
</TreeView> 

Нажмите обработчика:

 private void MenuItem_Click(object sender, RoutedEventArgs e) 
    { 
     Point menuClickPoint = ((sender as FrameworkElement).Parent as ContextMenu).TranslatePoint(new Point(0, 0), _filesTree); 
     DependencyObject obj = _filesTree.InputHitTest(menuClickPoint) as DependencyObject; 

     while (obj != null && !(obj is TreeViewItem)) 
     { 
      obj = VisualTreeHelper.GetParent(obj); 
     } 

     (obj as TreeViewItem).Items.Add("(new)"); 
    } 

И в моей * MenuItem_Click * обработчик событий я добавляю новые элементы TreeViewItems для элемента с щелчком, что отлично работает. Но после добавления нового (например, в «Persistent» поддерева), щелкните правой кнопкой мыши на этом новом подэлементе, снова откроет контекстное меню. Это то, что мне не нужно, потому что мне нужно другое контекстное меню для этих новых добавленных элементов (с опцией «Удалить»). Как добиться контекстного меню откроется только при щелчке правой кнопкой мыши по корневому элементу (TextBlock), а не внутри поддерева?

Спасибо

+0

разместить MenuItem_Click код – makc

+0

Вопрос отредактирован ... –

+0

Похоже, что все ваши предметы будут иметь тот же ContextMenu. Я предлагаю использовать HierarchicalDataTemplate для изменения того, какие элементы используют контекстное меню. – Kcvin

ответ

0

я явно определено новое контекстное меню для каждого подраздела:

 TreeViewItem tvi = new TreeViewItem(); 
     tvi.ContextMenu =(ContextMenu) this._filesTree.Resources["_subItemContextMenu"]; 
     tvi.Header = "(new)"; 

     (obj as TreeViewItem).Items.Add(tvi); 

* _subItemContextMenu * в TreeView ресурсов:

<ContextMenu x:Key="_subItemContextMenu"> 
     <MenuItem Header="Remove" Click="MenuItem_Remove" /> 
</ContextMenu>