gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:30:13 25 4
gpt4 key购买 nike

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

上面的两行似乎没有做任何事情,即在跨过每一行后,它们在调试器 View 中都保持为 false。

我认为我没有设置这些值的任何事件,至少我没有附加任何事件。

我做错了什么?

最佳答案

我建议你设置:

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属性(property)。请注意,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
}
}

关于c# - 将 ToolStripMenuItem.Visible 设置为 true 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com