所有表格中的相同主菜单 - winforms .net

时间:2017-09-25 12:24:49

标签: c# .net forms winforms

我想在我的应用程序中的所有打开的表单中使用一个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相同的菜单行为。

如果有人对如何实现这一点有任何建议,我将非常感谢。

1 个答案:

答案 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);
}

演示: