C#.NET(WinForm)-主窗体分为菜单(左)和内容(右,子窗体)

C#.NET(WinForm)-主窗体分为菜单(左)和内容(右,子窗体),c#,.net,winforms,menu,C#,.net,Winforms,Menu,很久没有在winform上工作了(现在我是一名asp.net开发人员),但这段时间我需要一个应用程序来使用自己,所以我今天早上开始工作,出现了问题(因为每个项目都开始了…哈哈) 我在考虑使用一个主窗体,将其分为两个面:左侧(约占屏幕宽度的20%)将包含一个菜单(menustrip?),其余部分将是“子窗体”的侧面 其思想是,单击菜单的一个元素(记住,mainform的左侧),它将创建并实例化一个表单,并在内容侧(右侧)显示它 在内容端(右)同时只有一个表单,但我可能需要ShowDialog属性来

很久没有在winform上工作了(现在我是一名asp.net开发人员),但这段时间我需要一个应用程序来使用自己,所以我今天早上开始工作,出现了问题(因为每个项目都开始了…哈哈)

我在考虑使用一个主窗体,将其分为两个面:左侧(约占屏幕宽度的20%)将包含一个菜单(menustrip?),其余部分将是“子窗体”的侧面

其思想是,单击菜单的一个元素(记住,mainform的左侧),它将创建并实例化一个表单,并在内容侧(右侧)显示它

在内容端(右)同时只有一个表单,但我可能需要ShowDialog属性来创建一个新表单,与主表单分开

问题是:

我不知道在mainform中应该使用哪个控件在mainform的右侧放置一个“contentplaceholder”(类似asp.net),这样我就可以通过单击菜单的元素来动态加载/卸载表单


我知道如何打开一个新对话框(form.ShowDialog,等等),但我不记得这是否可行。

你的英语其实相当不错。您可能需要做的是,不要让每个菜单项都显示一个新的
表单
,而是让它创建一个新的
控件
。由于您一次只希望打开一个面板,因此可以在主窗口的右侧添加一个面板,并在该面板内外简单地交换控件。因此,当单击菜单项1时:

MyControl1 newControl= new MyControl1();

newControl.Dock = DockStyle.Fill;
placeHolderPanel.Controls.Clear();
placeHolderPanel.Controls.Add(newControl);

这是一个非常常见的用户界面模型。首先在表单上放置一个SplitContainer,它提供两个面板和一个可以调整的分隔符。在提供导航的左侧面板上放置一个树状视图。将其Dock属性设置为Fill。添加一些节点,它们将成为“菜单项”。您可以使用图标和嵌套节点任意设置

您可以通过实现树视图的AfterSelect事件的事件处理程序来响应用户所做的选择。使用节点的标记或文本属性识别单击的节点。像这样:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
        switch (e.Node.Text) {
            case "Home":
                showScreen(new UserControl1());
                break;
            case "View":
                showScreen(new Form2());
                break;
            // etc...
        }
    }
    private void showScreen(Control ctl) {
        while (splitContainer1.Panel2.Controls.Count > 0)
            splitContainer1.Panel2.Controls[0].Dispose();
        // Support forms too:
        if (ctl is Form) {
            var frm = ctl as Form;
            frm.TopLevel = false;
            frm.FormBorderStyle = FormBorderStyle.None;
            frm.Visible = true;
        }
        ctl.Dock = DockStyle.Fill;
        splitContainer1.Panel2.Controls.Add(ctl);
    }
showScreen()方法需要用新控件替换右面板中显示的任何控件。您可以支持表单和用户控件。两者在Winforms designer中都表现良好,允许您关注它们的外观。像这样:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
        switch (e.Node.Text) {
            case "Home":
                showScreen(new UserControl1());
                break;
            case "View":
                showScreen(new Form2());
                break;
            // etc...
        }
    }
    private void showScreen(Control ctl) {
        while (splitContainer1.Panel2.Controls.Count > 0)
            splitContainer1.Panel2.Controls[0].Dispose();
        // Support forms too:
        if (ctl is Form) {
            var frm = ctl as Form;
            frm.TopLevel = false;
            frm.FormBorderStyle = FormBorderStyle.None;
            frm.Visible = true;
        }
        ctl.Dock = DockStyle.Fill;
        splitContainer1.Panel2.Controls.Add(ctl);
    }

仅此而已,只需从这里关注实际的“屏幕”即可。

我同意Hans的观点,但我想补充一点,因为您希望使用将放置在主窗体而不是控件上的窗体,您可能需要这样的东西:

static public void ReplaceControl(Control ToReplace, Form ReplaceWith) {
    ReplaceWith.TopLevel=false;
    ReplaceWith.FormBorderStyle=FormBorderStyle.None;
    ReplaceWith.Show();
    ReplaceWith.Anchor=ToReplace.Anchor;
    ReplaceWith.Dock=ToReplace.Dock;
    ReplaceWith.Font=ToReplace.Font;
    ReplaceWith.Size=ToReplace.Size;
    ReplaceWith.Location=ToReplace.Location;
    ToReplace.Parent.Controls.Add(ReplaceWith);
    ToReplace.Visible=false;
}

它将有效地允许您使用占位符并放置基于表单的窗口,而不是它

我强烈建议,如果您必须学习/重新学习一些客户端ui编码,并且这是一个新项目,那么请看看WPF+MVVM。如果您长期从事web开发,这可能是一个更容易的过渡。MVC和MVVM之间有很多相似之处。是的,这是一件一直在考虑很长时间的事情,学习WPF和MVC,但问题是我每天只有一到两个业余时间,而且我不能一直在开发,我不在床上。哈哈。因为这不是一个非常复杂的下一个项目,我能遇到的“唯一”界面问题是(我将有一个像CCLeaner/NOD32这样的UI,菜单在左边,内容在右边),我在想,不要在上面花费太多时间,这只是一个个人项目,应该很容易就能完成。所以我想用我在WF上的所有知识是个好主意。我很高兴你能理解我,我已经一次又一次地失去了关于英语和表达的知识。。。好的,让我们看看:我应该在屏幕右侧放置一个面板(“内容侧”),然后在上面创建并实例一个用户控件?(至少这是我所理解的)那么,我应该在winform用户控件上转换我的“子窗体”(它们是winforms)?非常感谢:)好的,我已经测试过了,我想这就是我需要的。多谢了,老兄,我正想做那样的事,但我不太确定。如果我有另一个问题,我会发布它,因为我认为这是一个非常好的社区,我也会尝试帮助其他人:)还有一件事,你可能想使用SplitPanel作为你的主控件。左侧分割面板包含菜单,右侧是“窗口”控件。