C# 所有表单都有相同的主菜单-winforms.net
我想在我的应用程序中的所有打开的表单中使用一个MainMenuStrip。我不想在所有窗体上显示相同的主菜单,相反,主菜单应该只出现在我的主窗体上,并且应该可以从所有其他窗体访问 所需的行为与Visual Studio 2013中的相同(可能其他版本也采用相同的方式)。如果一个文档处于浮动状态,并且您按下ALT按钮或任何组合(例如ALT+F),则主窗口将出现在前面,并且主菜单可见,尽管主窗口似乎没有激活。再次按下ALT按钮时,焦点将返回浮动窗口 当按下菜单键时,我尝试将消息从同级表单转发到主表单,但主表单必须是前台窗口才能处理消息-正如我在.net源代码中看到的那样 我不想使用MDI-我只希望拥有与MDI中相同的菜单行为C# 所有表单都有相同的主菜单-winforms.net,c#,.net,forms,winforms,C#,.net,Forms,Winforms,我想在我的应用程序中的所有打开的表单中使用一个MainMenuStrip。我不想在所有窗体上显示相同的主菜单,相反,主菜单应该只出现在我的主窗体上,并且应该可以从所有其他窗体访问 所需的行为与Visual Studio 2013中的相同(可能其他版本也采用相同的方式)。如果一个文档处于浮动状态,并且您按下ALT按钮或任何组合(例如ALT+F),则主窗口将出现在前面,并且主菜单可见,尽管主窗口似乎没有激活。再次按下ALT按钮时,焦点将返回浮动窗口 当按下菜单键时,我尝试将消息从同级表单转发到主表单
如果有人对如何实现这一点有任何建议,我将非常感激。如果你想模仿VS的行为,那么这里有一个方法
static class Program
{
static Form _main;
static Form _previous;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// simulate some environment here
_main = new Form1();
_main.FormClosed += (s, e) => Application.Exit();
_main.Show();
new Form2 { Text = "1" }.Show();
new Form2 { Text = "2" }.Show();
new Form2 { Text = "3" }.Show();
Application.Run();
}
public static void MenuOpen(Form form)
{
_main.Activate();
_previous = form;
_main.MainMenuStrip.MenuDeactivate += MainMenuStrip_MenuDeactivate;
_main.MainMenuStrip.Show();
}
static void MainMenuStrip_MenuDeactivate(object sender, EventArgs e)
{
_main.MainMenuStrip.MenuDeactivate -= MainMenuStrip_MenuDeactivate;
_previous.Activate();
_previous.Focus();
}
}
Form1
是任何定义了MainMenuStrip
的表单(也称为主表单),当表单关闭时,应用程序结束
在Form2
中,您只需处理菜单按键,一种可能性是预览按键向下事件处理程序(不要忘记设置KeyPreview=true
):
演示:
点击菜单热键时,记住表单,激活主表单,显示菜单。菜单关闭时-激活上一个表单。还是我遗漏了什么?这个问题与命令行界面有什么关系?该标记似乎不相关。该标记应该是cli,就像在c++/cli中一样。您有一个很好的答案,但我仍然很好奇,为什么您不想使用mdi,而只想在mdi中模拟它?您的子窗体被卡在主窗体的范围内。我需要能把它们拖出来,效果很好。我必须将ProcessCmdKey与VK_菜单一起使用,因为其他控件会捕获PreviewKeyDown事件。谢谢!
void Form2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.Alt)
Program.MenuOpen(this);
}