如何禁用 MDI 子项的条形菜单项

Posted

技术标签:

【中文标题】如何禁用 MDI 子项的条形菜单项【英文标题】:How to disable a strip menu item from an MDI child 【发布时间】:2014-12-30 03:12:25 【问题描述】:

我有一个带有条形菜单的父表单,名为topMenu

我有一个名为“SignIn”的子表单,当用户登录时,我想禁用topMenu.item.logIn 并启用topMenu.item.Logout

如何从子窗体中禁用父容器的topMenu

当用户单击条形菜单项“登录”时,将执行以下代码。

private void signInToolStripMenuItem_Click(object sender, EventArgs e)

    var newMDIChild = new SignIn();

    // Set the Parent Form of the Child window.
    newMDIChild.MdiParent = this;

    newMDIChild.Dock = DockStyle.Fill;
    // Display the new form.
    newMDIChild.Show();


用户输入用户名和密码后,将执行以下代码

public partial class SignIn : Form

    public SignIn()
    
        InitializeComponent();
    

    private void btn_signin_Click(object sender, EventArgs e)
    
        UserInfo.Autherized = true;

        // here I want to disable the sign in menu item
        // and enable the sign out menu item which is located on the parent form
        this.Close();
    

【问题讨论】:

登录是标准形式,一旦登录成功,我想禁用菜单项。你的意思是我可以重新加载父表单并在加载方法中处理条件? 来自顶部的条形菜单。 什么代码?当用户单击它时,它只是菜单中的一个项目,它会打开一个子表单。 【参考方案1】:

我更希望父 Form 从子 Form 中获取所需的数据,而不是子 Form 对父 Form 了解太多并修改其上的控件。

向您的登录表单添加一个属性,该属性返回用户是否已通过身份验证。 (如果 UserInfo 是公开的并且可以从登录表单外部引用,那么只需使用它并跳过这一步。)

public bool IsUserAuthenticated

    get  return UserInfo.Autherized; 

然后读取该值并在登录表单关闭时采取适当的操作。 (订阅登录表单关闭时执行的事件,并告诉它运行一些代码。)

private void signInToolStripMenuItem_Click(object sender, EventArgs e)

    var si = new SignIn();
    si.MdiParent = this;
    si.Dock = DockStyle.Fill;
    si.FormClosed += delegate
                     
                         if (si.IsUserAuthenticated)
                         
                             yourLoginItem.Enabled = false;
                             yourLogoutItem.Enabled = true;
                         ;
                     
    si.Show();

有更简单的方法可以做到这一点,比如只实例化一个新的登录表单并使用 ShowDialog() 而不是设置 MdiParent 和停靠等等,但这应该适用于您现有的代码。

【讨论】:

成功了 :) 谢谢。我有几个问题。为什么要添加一个属性来返回 UserInfo.Autherized 的值而不是 if(UserInfo.Autherized == true)... FormClosed += delegate 到底是做什么的? SignIn() 表单关闭后是否执行操作? 是的,UserInfo.Autherized 是公开的,所以我将直接访问它。非常感谢你:)

以上是关于如何禁用 MDI 子项的条形菜单项的主要内容,如果未能解决你的问题,请参考以下文章

带有列表子项可聚焦android的列表视图上下文菜单

如何禁用底部导航视图的菜单项?

c#中如何动态添加菜单项并实现其点击?

WordPress 菜单:单击父菜单项时,仅显示该链接的子导航子项

如何在工具栏中禁用菜单项长按侦听器

在我的菜单项之后,如何禁用“文件”菜单中的文档列表?