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

C# .NET (WinForm) - MainForm divided on Menu (left) and Content (Right, child form)

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

我当时正在考虑有一个MainForm,将其分为两面:左侧(约占屏幕宽度的20%)将包含一个MENU(菜单),其余的将位于菜单的一面。 '子窗体'。

这个想法是,单击菜单中的一个元素(请记住,位于主窗体的左侧),它将创建并实例化一个窗体,并将其显示在内容侧(右侧)。

内容侧(右侧)将同时只有一种形式,但是我可能需要ShowDialog属性来创建一个新的形式,与主形式分开。

问题:

我不知道在主窗体中应使用哪个控件在主窗体的右侧放置" contentplaceholder"(如asp.net),因此我可以通过单击来动态加载/卸载该窗体在菜单的元素中。

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


这是一个非常常见的用户界面模型。首先,在窗体上放置一个SplitContainer,它为您提供两个面板和一个可以调整的分隔线。在左侧面板上放置一个TreeView,以提供导航。将其Dock属性设置为Fill。向其中添加一些节点,它们将成为"菜单项"。您可以通过图标和嵌套节点将其任意设置。

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

1
2
3
4
5
6
7
8
9
10
11
    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...
        }
    }

showScreen()方法需要用新的控件替换右面板中显示的任何控件。您可以支持表单以及用户控件。两者在Winforms设计器中的表现都很好,使您可以专注于外观。像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
    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);
    }

仅此而已,只需从此处着重于实际的"屏幕"即可。


您的英语实际上很不错。您可能想要做的是,不是让每个菜单项都调出一个新的Form,而是让它创建一个新的Control。由于一次只希望打开一个,因此可以在主窗口的右侧添加一个面板,并在该面板内外添加简单的交换控件。因此,当单击MenuItem1时:

1
2
3
4
5
MyControl1 newControl= new MyControl1();

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


我同意汉斯在那里的所有事情,除了我想补充一点,因为您想使用将放在主窗体而非控件上的FORMS,因此您可能需要这样的东西:

1
2
3
4
5
6
7
8
9
10
11
12
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;
}

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