我想在我的应用程序中的所有打开的表单中使用一个MainMenuStrip。我不想在所有表单上显示相同的MainMenu,而MainMenu应该只出现在我的MainForm上,并且应该可以从我的所有其他表单访问。
所需的行为与Visual Studio 2013中的相同(可能其他版本以相同的方式执行)。如果一个文档是浮动的并且您点击了ALT按钮或任何组合,例如ALT + F,MainWindow来到前面,MainMenu可见,虽然MainWindow似乎没有被激活。再次点击ALT按钮时,焦点将返回到浮动窗口。
当菜单键被命中时,我尝试将消息从兄弟形式转发到MainForm,但是MainForm需要是Foreground窗口来处理消息 - 正如我在.net源代码中看到的那样。 https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ToolStripManager.cs,1680
我不想使用MDI - 我只希望拥有与MDI相同的菜单行为。
如果有人对如何实现这一点有任何建议,我将非常感谢。
答案 0 :(得分:1)
如果你想模仿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
):
void Form2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.Alt)
Program.MenuOpen(this);
}
演示: