C# 如何让多个表单在Winforms应用程序中共享一个公共菜单?
我有一个现有的.NET Winforms应用程序,它由一些复杂的表单组成,并且 1) 这些表单在应用程序的生命周期内一直有效,并且 2) 一次只显示一个表单(用户在表单之间切换) 我需要这些表单共享一个由单个业务逻辑控制器处理的公共菜单。(控制器也会不断更新可见表单) 是否有办法使同一菜单出现在每个表单的顶部,并由其公共控制器处理该菜单,而无需将其设置为MDI应用程序C# 如何让多个表单在Winforms应用程序中共享一个公共菜单?,c#,.net,winforms,menu,C#,.net,Winforms,Menu,我有一个现有的.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
}
}