ToolStripMenuItem 可见的奇怪行为 属性
ToolStripMenuItem strange behavior on visible property
我很久以前和现在都遇到过这个问题。我无法弄清楚在表单加载时编辑 ToolStripMenuItem
控件 a Visible
属性 需要做什么特别的事情。
在designer.cs
private System.Windows.Forms.ToolStripMenuItem mnuExport;
//
// mnuExport
//
this.mnuExport.Name = "mnuExport";
this.mnuExport.Size = new System.Drawing.Size(116, 22);
this.mnuExport.Text = "Export";
this.mnuExport.Visible = false;
this.mnuExport.Click += new System.EventHandler(this.mnuExport_Click);
表格代码
public partial class MainBuilder : Form
{
private void MainBuilder_Load(object sender, EventArgs e)
{
mnuExport.Visible = true;
}
}
在上面的代码中,导出的是一个类型为 ToolStripMenuItem
的菜单项,它通过表单设计模式中的 属性 网格,我已将其 Visible
属性 修改为错误的。所以在表单加载中我想将可见状态切换为true。我认为这很容易,所以我编写了所有逻辑,但失败了。所以我决定删除我所有的代码并简单地将集合硬编码为 true ,令我惊讶的是这不起作用。
当我将断点放在 form_load 行时,我清楚地看到它是假的,如果它让行 运行 值仍然是假的。
我记得以前见过这个问题,但找不到任何相关信息。我还尝试了 window 中的 4-5 个其他菜单项,它们都显示相同的行为。
编辑
只是试图将 visible = true
放在 designer.cs 中,而在 form_load 中仍然告诉我该值为 false。这里有一些主要问题。
如评论中所述,属性 Visible
getter 直到生命周期后期才反映实际的内部 属性 值。在 form_loaded
事件中仍然不可用。我的主要问题是一个菜单可见性状态是基于如果所有子菜单都不可见那么它也不应该。为此,我迭代了它的 child 并检查了 Visible
属性。问题是他们有 Visible
到 false
由于它的工作方式 parent 也将它自己的 Visible
设置为 false
。
我不喜欢这个解决方案,但这是让它发挥作用的唯一方法
// get all sub menus
var subMenus = mnuExport.DropDownItems.Cast<ToolStripItem>().ToList();
// create a list of bool that will store the visible state I want the controls to have. put them to true by default
var menusVisibleStates = Enumerable.Repeat(true, menus.Count).ToList();
// set the visibility state of each sub menus
for (int i = 0; i < menus.Count; i++)
{
// some logic is here that choose true or false but is irrelevant here
var visibleStateIWant = true;
// set the visible state stored
menusVisibleStates[i] = false;
// set the actual control value that will change later on
menus[i].Visible = false;
}
/// now here I use the state I have specified and NOT the menu object property
mnuExport.Visible = menusVisibleStates.Any(o => o);
我很久以前和现在都遇到过这个问题。我无法弄清楚在表单加载时编辑 ToolStripMenuItem
控件 a Visible
属性 需要做什么特别的事情。
在designer.cs
private System.Windows.Forms.ToolStripMenuItem mnuExport;
//
// mnuExport
//
this.mnuExport.Name = "mnuExport";
this.mnuExport.Size = new System.Drawing.Size(116, 22);
this.mnuExport.Text = "Export";
this.mnuExport.Visible = false;
this.mnuExport.Click += new System.EventHandler(this.mnuExport_Click);
表格代码
public partial class MainBuilder : Form
{
private void MainBuilder_Load(object sender, EventArgs e)
{
mnuExport.Visible = true;
}
}
在上面的代码中,导出的是一个类型为 ToolStripMenuItem
的菜单项,它通过表单设计模式中的 属性 网格,我已将其 Visible
属性 修改为错误的。所以在表单加载中我想将可见状态切换为true。我认为这很容易,所以我编写了所有逻辑,但失败了。所以我决定删除我所有的代码并简单地将集合硬编码为 true ,令我惊讶的是这不起作用。
当我将断点放在 form_load 行时,我清楚地看到它是假的,如果它让行 运行 值仍然是假的。
我记得以前见过这个问题,但找不到任何相关信息。我还尝试了 window 中的 4-5 个其他菜单项,它们都显示相同的行为。
编辑
只是试图将 visible = true
放在 designer.cs 中,而在 form_load 中仍然告诉我该值为 false。这里有一些主要问题。
如评论中所述,属性 Visible
getter 直到生命周期后期才反映实际的内部 属性 值。在 form_loaded
事件中仍然不可用。我的主要问题是一个菜单可见性状态是基于如果所有子菜单都不可见那么它也不应该。为此,我迭代了它的 child 并检查了 Visible
属性。问题是他们有 Visible
到 false
由于它的工作方式 parent 也将它自己的 Visible
设置为 false
。
我不喜欢这个解决方案,但这是让它发挥作用的唯一方法
// get all sub menus
var subMenus = mnuExport.DropDownItems.Cast<ToolStripItem>().ToList();
// create a list of bool that will store the visible state I want the controls to have. put them to true by default
var menusVisibleStates = Enumerable.Repeat(true, menus.Count).ToList();
// set the visibility state of each sub menus
for (int i = 0; i < menus.Count; i++)
{
// some logic is here that choose true or false but is irrelevant here
var visibleStateIWant = true;
// set the visible state stored
menusVisibleStates[i] = false;
// set the actual control value that will change later on
menus[i].Visible = false;
}
/// now here I use the state I have specified and NOT the menu object property
mnuExport.Visible = menusVisibleStates.Any(o => o);