XAML Treeviewitem的上下文菜单(通过不同的属性区分)

时间:2022-01-31 14:09:50

In XAML, how do you define a context menu for treeviewitems that are distinguished by different attributes?

在XAML中,如何为treeviewitems定义由不同属性区分的上下文菜单?

3 个解决方案

#1


28  

XAML

<TreeView Name="SolutionTree"  BorderThickness="0" SelectedItemChanged="SolutionTree_SelectedItemChanged"  >
  <TreeView.Resources>
    <ContextMenu x:Key ="SolutionContext"  StaysOpen="true">
      <MenuItem Header="Add..." Click="AddFilesToFolder_Click"/>
      <MenuItem Header="Rename"/>
    </ContextMenu>
    <ContextMenu x:Key="FolderContext"  StaysOpen="true">
      <MenuItem Header="Add..." Click="AddFilesToFolder_Click"/>
      <MenuItem Header="Rename"/>
      <MenuItem Header="Remove"/>
      <Separator/>
      <MenuItem Header="Copy"/>
      <MenuItem Header="Cut"/>
      <MenuItem Header="Paste"/>
      <MenuItem Header="Move"/>
    </ContextMenu>
  </TreeView.Resources>
</TreeView>

C-sharp

private void SolutionTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    TreeViewItem SelectedItem = SolutionTree.SelectedItem as TreeViewItem;
    switch (SelectedItem.Tag.ToString())
    {
        case "Solution":
            SolutionTree.ContextMenu = SolutionTree.Resources["SolutionContext"] as System.Windows.Controls.ContextMenu;
            break;
        case "Folder":
            SolutionTree.ContextMenu = SolutionTree.Resources["FolderContext"] as System.Windows.Controls.ContextMenu;
            break;
    }
}

#2


14  

You could define the ContextMenus in several styles and select the style using a ItemContainerStyleSelector, based on those attributes.

您可以在几个样式中定义contextmenu,并根据这些属性使用ItemContainerStyleSelector选择样式。

Or you could directly specify an ItemContainerStyle and select the appropriate ContextMenu using triggers

或者您可以直接指定ItemContainerStyle并使用触发器选择适当的ContextMenu

#3


13  

<TreeView>
  <TreeView.Resources>
    <ContextMenu x:Key="ScaleCollectionPopup">
      <MenuItem Header="New Scale..."/>
    </ContextMenu>
    <ContextMenu x:Key="ScaleItemPopup">
      <MenuItem Header="Remove Scale"/>
    </ContextMenu>
  </TreeView.Resources>
  <TreeViewItem Header="Scales" ItemsSource="{Binding Scales}" ContextMenu="{StaticResource ScaleCollectionPopup}">
    <TreeViewItem.ItemContainerStyle>
      <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="ContextMenu" Value="{StaticResource ScaleItemPopup}"/>
      </Style>
    </TreeViewItem.ItemContainerStyle>
  </TreeViewItem>
</TreeView>

#1


28  

XAML

<TreeView Name="SolutionTree"  BorderThickness="0" SelectedItemChanged="SolutionTree_SelectedItemChanged"  >
  <TreeView.Resources>
    <ContextMenu x:Key ="SolutionContext"  StaysOpen="true">
      <MenuItem Header="Add..." Click="AddFilesToFolder_Click"/>
      <MenuItem Header="Rename"/>
    </ContextMenu>
    <ContextMenu x:Key="FolderContext"  StaysOpen="true">
      <MenuItem Header="Add..." Click="AddFilesToFolder_Click"/>
      <MenuItem Header="Rename"/>
      <MenuItem Header="Remove"/>
      <Separator/>
      <MenuItem Header="Copy"/>
      <MenuItem Header="Cut"/>
      <MenuItem Header="Paste"/>
      <MenuItem Header="Move"/>
    </ContextMenu>
  </TreeView.Resources>
</TreeView>

C-sharp

private void SolutionTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    TreeViewItem SelectedItem = SolutionTree.SelectedItem as TreeViewItem;
    switch (SelectedItem.Tag.ToString())
    {
        case "Solution":
            SolutionTree.ContextMenu = SolutionTree.Resources["SolutionContext"] as System.Windows.Controls.ContextMenu;
            break;
        case "Folder":
            SolutionTree.ContextMenu = SolutionTree.Resources["FolderContext"] as System.Windows.Controls.ContextMenu;
            break;
    }
}

#2


14  

You could define the ContextMenus in several styles and select the style using a ItemContainerStyleSelector, based on those attributes.

您可以在几个样式中定义contextmenu,并根据这些属性使用ItemContainerStyleSelector选择样式。

Or you could directly specify an ItemContainerStyle and select the appropriate ContextMenu using triggers

或者您可以直接指定ItemContainerStyle并使用触发器选择适当的ContextMenu

#3


13  

<TreeView>
  <TreeView.Resources>
    <ContextMenu x:Key="ScaleCollectionPopup">
      <MenuItem Header="New Scale..."/>
    </ContextMenu>
    <ContextMenu x:Key="ScaleItemPopup">
      <MenuItem Header="Remove Scale"/>
    </ContextMenu>
  </TreeView.Resources>
  <TreeViewItem Header="Scales" ItemsSource="{Binding Scales}" ContextMenu="{StaticResource ScaleCollectionPopup}">
    <TreeViewItem.ItemContainerStyle>
      <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="ContextMenu" Value="{StaticResource ScaleItemPopup}"/>
      </Style>
    </TreeViewItem.ItemContainerStyle>
  </TreeViewItem>
</TreeView>