繁体   English   中英

在 TreeView 中使用 ContextMenu

[英]Using ContextMenu in TreeView

我想使用 C# 制作一个应用程序。 这是它的用户界面的一部分:

顶部有菜单和树状视图的应用程序。 Tree_View 已打开并显示多个菜单项。

菜单栏下方的白色区域代表一个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 模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM