Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让多个表单在Winforms应用程序中共享一个公共菜单?_C#_.net_Winforms_Menu - Fatal编程技术网

C# 如何让多个表单在Winforms应用程序中共享一个公共菜单?

C# 如何让多个表单在Winforms应用程序中共享一个公共菜单?,c#,.net,winforms,menu,C#,.net,Winforms,Menu,我有一个现有的.NET Winforms应用程序,它由一些复杂的表单组成,并且 1) 这些表单在应用程序的生命周期内一直有效,并且 2) 一次只显示一个表单(用户在表单之间切换) 我需要这些表单共享一个由单个业务逻辑控制器处理的公共菜单。(控制器也会不断更新可见表单) 是否有办法使同一菜单出现在每个表单的顶部,并由其公共控制器处理该菜单,而无需将其设置为MDI应用程序 非常感谢 在自定义控件(用户控件)中构建菜单,然后将该控件添加到每个表单。使用菜单创建基本表单。然后各个表单可以继承这个基本表单

我有一个现有的.NET Winforms应用程序,它由一些复杂的表单组成,并且

1) 这些表单在应用程序的生命周期内一直有效,并且

2) 一次只显示一个表单(用户在表单之间切换)

我需要这些表单共享一个由单个业务逻辑控制器处理的公共菜单。(控制器也会不断更新可见表单)

是否有办法使同一菜单出现在每个表单的顶部,并由其公共控制器处理该菜单,而无需将其设置为MDI应用程序


非常感谢

在自定义控件(用户控件)中构建菜单,然后将该控件添加到每个表单。

使用菜单创建基本表单。然后各个表单可以继承这个基本表单,自动获得相同的菜单。要重构现有表单,请编辑form.cs并更改

 public partial class Form1 : Form 


我知道这是个老问题,但我的回答可能仍然对人们有帮助

本课程将是管理以下内容的良好开端:

免责声明:未经测试,但该想法应该有效

static class FormService{
    /*
     * Members
     */
    private static Dictionary<string, Form> _forms = new Dictionary<string, Form>();
    private static Dictionary<string, Type> _types = new Dictionary<string, Type>();       
    private static Form opened_ = null;

    /*
     * Properties
     */

    public static Form Opened

    /*
     * Methods
     */
    public static void register(string className, Type type){
        if (_types.ContainsKey(className))throw new Exception("Form already registered");
        _forms.Add(className, Activator.CreateInstance(type));
        _types.Add(className, type);

    }

    // use with Convert.ChangeType
    public static Type getFormType(string className){
        return _types[className];
    }

    public static void open(string className){
        if (opened_ != null){
            opened_.Hide();
        }
        opened_ = _forms[className];
        opened_.ShowDialog(); // show dialog will block main menu actions
    }

}
静态类FormService{
/*
*成员
*/
私有静态字典_forms=new Dictionary();
私有静态字典_types=新字典();
打开的私有静态表单=null;
/*
*性质
*/
公开静态表格
/*
*方法
*/
公共静态无效寄存器(字符串类名称,类型){
if(_types.ContainsKey(className))抛出新异常(“表单已注册”);
_Add(className,Activator.CreateInstance(type));
_添加(类名,类型);
}
//与Convert.ChangeType一起使用
公共静态类型getFormType(字符串类名称){
返回类型[className];
}
公共静态void open(字符串类名称){
如果(已打开?=空){
已打开。隐藏();
}
打开的表格[类名];
已打开的uu.ShowDialog();//显示对话框将阻止主菜单操作
}
}

我还会将菜单命令添加为私有方法,调用虚函数或抽象On函数,以便您可以在每个窗体上以不同方式处理操作。对于常见操作,您应该能够将它们直接编码到基本表单中。
static class FormService{
    /*
     * Members
     */
    private static Dictionary<string, Form> _forms = new Dictionary<string, Form>();
    private static Dictionary<string, Type> _types = new Dictionary<string, Type>();       
    private static Form opened_ = null;

    /*
     * Properties
     */

    public static Form Opened

    /*
     * Methods
     */
    public static void register(string className, Type type){
        if (_types.ContainsKey(className))throw new Exception("Form already registered");
        _forms.Add(className, Activator.CreateInstance(type));
        _types.Add(className, type);

    }

    // use with Convert.ChangeType
    public static Type getFormType(string className){
        return _types[className];
    }

    public static void open(string className){
        if (opened_ != null){
            opened_.Hide();
        }
        opened_ = _forms[className];
        opened_.ShowDialog(); // show dialog will block main menu actions
    }

}