将ToolStripMenuItem.Visible设置为true不起作用

时间:2012-03-19 17:45:43

标签: c# visible contextmenustrip toolstripitem

我有一个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;

上面的两行似乎没有做任何事情,即在遍历每一行后,两者都在调试器视图中保持为假。

我认为我没有任何关于这些价值观的事件,至少我没有附加任何事件。

我做错了什么?

2 个答案:

答案 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的直接引用,但显然不是。