在 TreeView 中使用上下文菜单

Using ContextMenu in TreeView

我想用 C# 制作一个应用程序。这是 UI:

的一部分

菜单栏下方的白色区域代表一个TreeView。我希望用鼠标右键单击时 Tree_View 菜单出现在白色区域的任何位置。

这是 Tree_View 对象的 XAML 代码(注意那里的 foo 函数):

<MenuItem Name="Menu_Tree" Header="_Tree_View">
    <MenuItem Header="_New_Scene" IsCheckable="false" Click = foo/>
    <MenuItem Header="_Copy_This_Scene" IsCheckable="false"/>
    <MenuItem Header="_Remove_This_Scene" IsCheckable="false"/>
    <Separator />
    <MenuItem Header="_New_Shot" IsCheckable="false"/>
    <MenuItem Header="_Copy_This_Shot" IsCheckable="false"/>
    <MenuItem Header="_Remove_This_Shot" IsCheckable="false"/>
    <Separator />
    <MenuItem Header="_Move_This_Shot_Up" IsCheckable="false"/>
    <MenuItem Header="_Move_This_Shot_Down" IsCheckable="false"/>
</MenuItem> 

这是 Tree_View 对象的 XAML 代码:

<Grid Name="TreeHolder" Column="0" Margin="20,10,10,10" Background="DimGray">
    <TreeView Name="myTree" MouseRightButtonDown="something" ToolTip="Right Click to Add or Remove Scenes and Scots.">
    </TreeView>
</Grid>

这是 something 函数,应该通过右键单击触发:

private void something(object sender, MouseButtonEventArgs e)
{
    ContextMenu cm = new ContextMenu();
    //cm.Items.Add("Add a New Scene ?", ... );
    Menu_Tree.ContextMenu = cm;
}

由于那里没有任何作用,我想问以下问题:

a) 如何让Tree_view菜单项也出现在Tree_View对象的白色区域?

b) 如果是这样,我将如何使它成为一个启用的菜单,例如能够触发 foo 功能?

(在其他世界,制作菜单列表的精确副本,右键单击使其可见并使其正常工作)

我坚信它与我无法正常使用的 ContextMenu 有关,因此我们将不胜感激任何帮助。

要添加的项目是 MenuItem 项。您可以像创建任何其他对象一样创建每个项目,设置其 Header 属性 并分配一个 Click 事件处理程序。 senderTreeView 本身。

private void something(object sender, MouseButtonEventArgs e)
{
   var cm = new ContextMenu();
   var newSceneMenuItem = new MenuItem { Header = "_New_Scene" };
   newSceneMenuItem.Click += OnNewSceneClick;
   cm.Items.Add(newSceneMenuItem);

   var treeView = (TreeView) sender;
   treeView.ContextMenu = cm;
}

private void OnNewSceneClick(object sender, RoutedEventArgs e)
{
   MessageBox.Show("I am a Message Box.", "New Scene clicked");
}

但是,您可以在 XAML 中更轻松地完成此操作,而无需右键单击处理程序。

<Grid Name="TreeHolder" Column="0" Margin="20,10,10,10" Background="DimGray">
   <TreeView Name="myTree" ToolTip="Right Click to Add or Remove Scenes and Scots.">
      <TreeView.ContextMenu>
         <ContextMenu>
            <MenuItem Header="_New_Scene" Click="foo"/>
            <MenuItem Header="_Copy_This_Scene"/>
            <MenuItem Header="_Remove_This_Scene"/>
            <Separator />
            <MenuItem Header="_New_Shot"/>
            <MenuItem Header="_Copy_This_Shot"/>
            <MenuItem Header="_Remove_This_Shot"/>
            <Separator />
            <MenuItem Header="_Move_This_Shot_Up"/>
            <MenuItem Header="_Move_This_Shot_Down"/>
         </ContextMenu>
      </TreeView.ContextMenu>
   </TreeView>
</Grid>

不需要将IsCheckable设置为false,那已经是默认值了。您可以使用 commands 而不是分配 Click 事件处理程序,但我想这对您来说是一个太高级的话题,因为它看起来不像您在使用 MVVM 模式。