我有一个TreeView控件,其中的每个节点都要共享一个ContextMenuStrip,它有两个ToolStripMenuItems,即:
this.BuildTree = new MyApp.MainForm.TreeView();
this.ItemMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.DeleteMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ShowLogMenuItem = new System.Windows.Forms.ToolStripMenuItem();
...
this.ItemMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.DeleteMenuItem,
this.ShowLogMenuItem});
因此,在MouseUp事件中右键单击时,我会根据特定条件显示和隐藏这些项目。当两者都被隐藏时,我隐藏了ContextMenuStrip本身。问题是当我隐藏ContextMenuStrip时,似乎下次我要显示其中一个菜单项我必须在节点上单击两次。奇怪的是在第一次点击时重新显示我有以下代码的一个或两个项目:
ItemMenuStrip.Visible = true;
ShowLogMenuItem.Visible = true;
上面的两行似乎没有做任何事情,即在遍历每一行后,两者都在调试器视图中保持为假。
我认为我没有任何关于这些价值观的事件,至少我没有附加任何事件。
我做错了什么?
答案 0 :(得分:3)
我建议你设置:
this.BuildTree.ContextMenuStrip = this.ItemMenuStrip;
右键单击树上的菜单自动打开。
然后订阅ItemMenuStrip.Opening
事件以更改项目的可见性和上下文菜单本身:
void ItemMenuStrip_Opening(object sender, CancelEventArgs e)
{
if (something)
{
e.Cancel = true; // don't show the menu
}
else
{
// show/hide the items...
}
}
如果您需要知道点击点的当前位置(例如,要检查是否单击了树节点),您可以使用Control.MousePosition
属性。请注意,MousePosition
是屏幕坐标中的一个点,因此您需要调用treeView1.PointToClient(position)
来获取树坐标,例如:
private void ItemMenuStrip_Opening(object sender, CancelEventArgs e)
{
var pointClicked = this.BuildTree.PointToClient(Control.MousePosition);
var nodeClicked = this.BuildTree.GetNodeAt(pointClicked);
if (nodeClicked == null)
{
// no tree-node is clicked --> don't show the context menu
e.Cancel = true;
}
else
{
// nodeClicked variable is the clicked node;
// show/hide the context menu items accordingly
}
}
答案 1 :(得分:0)
因此弄清楚出现了什么问题我在this.ItemMenuStrip上设置了Visible而不是this.BuildTree.ContextMenuStrip。
这对我来说似乎很奇怪,因为我认为BuildTree.ContextMenuStrip只是对ItemMenuStrip的直接引用,但显然不是。