在 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
事件处理程序。 sender
是 TreeView
本身。
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 模式。
我想用 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
事件处理程序。 sender
是 TreeView
本身。
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 模式。