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 |
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); } |
仅此而已,只需从此处着重于实际的"屏幕"即可。
您的英语实际上很不错。您可能想要做的是,不是让每个菜单项都调出一个新的
1 2 3 4 5 | MyControl1 newControl= new MyControl1(); newControl.Dock = DockStyle.Fill; placeHolderPanel.Controls.Clear(); placeHolderPanel.Controls.Add(newControl); |
我同意汉斯在那里的所有事情,除了我想补充一点,因为您想使用将放在主窗体而非控件上的FORMS,因此您可能需要这样的东西: 它将有效地允许您使用占位符并放置基于窗体的窗口而不是它!
2
3
4
5
6
7
8
9
10
11
12
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;
}