2013-03-06 5 views
0

Как создать контекстное меню, которое будет отображаться, когда пользователь щелкнет правой кнопкой мыши элемент элемента моего дерева?ContextMenu and TreeView

Я хотел бы получить имя элемента, который был нажат, как это возможно?

Это мое дерево Вид:

<TreeView Name="tvwResultados" 
        MouseMove="DataGrid_MouseMove" 
        MouseLeftButtonDown="DataGrid_PreviewMouseLeftButtonDown" 
        ItemTemplate="{StaticResource empresaTemplate}" 
        ItemsSource="{Binding Empresas}" 
        Padding="0,6,0,6" 
        Background="Black" 
        BorderBrush="Gray" 
        BorderThickness="1"> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="BorderThickness" Value="1" /> 
        <Setter Property="Padding" Value="4,2,4,2" /> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="BorderBrush" Value="Gray" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.ItemContainerStyle> 
      <TreeView.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#171717" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Silver" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#333333" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Silver" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Gray" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="Silver" /> 
      </TreeView.Resources> 
     </TreeView> 

ответ

1

Есть несколько способов, вы можете добавить ContextMenu к вашим TreeViewItems в зависимости от многих факторов. Например, есть ContextMenu то же самое для каждого TreeViewItem? Откуда берутся MenuItems?

Одним из решений было бы добавить ContextMenu в ваш ItemContainerStyle. Вы можете определить ContextMenu как ресурс в вашем Window или любой другой элемент управления верхнего уровня, как это:

<Window.Resources> 
    <ContextMenu x:Key="TreeItemMenu"> 
     <MenuItem Header="Menu Item 1" Click="MenuItem_Click_1"/> 
     <MenuItem Header="Menu Item 2" Click="MenuItem_Click_2"/> 
    </ContextMenu> 
</Window.Resources> 

И тогда вы можете обновить ItemContainerStyle использовать этот ContextMenu так:

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="BorderThickness" Value="1" /> 
     <Setter Property="Padding" Value="4,2,4,2" /> 
     <Setter Property="ContextMenu" Value="{DynamicResource TreeItemMenu}"/> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="BorderBrush" Value="Gray" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</TreeView.ItemContainerStyle> 

Чтобы получить элемент, который был нажат, вам придется обрабатывать его отдельно. Вы можете использовать EventSetter прикрепить событие к каждому TreeViewItem, а затем отслеживать, какой элемент был последний щелкнул так:

Добавьте к этому сеттеры стиля:

<EventSetter Event="MouseRightButtonDown" Handler="OnTreeItemClicked"/> 

А потом это идет в коде за:

private void OnTreeItemClicked(object sender, MouseButtonEventArgs e) 
{ 
    _item = sender as TreeViewItem; 
    if (_item != null) 
    { 
     string header = _item.Header.ToString(); 
    } 
} 

Это добавит же ContextMenu каждые TreeViewItem, и жестким кодирует MenuItems, однако он демонстрирует, как вы бы добавить ContextMenu , Вы можете, конечно, получить более гибкий/динамический/продвинутый, но это должно дать вам основу для начала работы.

1

Проще всего ... Добавить ContextMenuStrip из панели инструментов в проектный вид. Добавьте в параметры меню, как вы этого хотите (переименуйте имя, если вы этого захотите, или оставьте его в ContextMenuStrip1. Тогда вам нужно всего лишь выбрать TreeView в режиме проектирования, свойствах и установить контекстное меню.

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