很长一段时间没有工作在winform上(现在我是一个asp.net开发人员),但这次我需要一个应用程序来使用自己,所以我今天早上开始工作并出现问题(因为每个项目都开始了。 ..lol)。
我在想有一个MainForm,将它分成两边:左边(约占屏幕宽度的20%),它将包含一个MENU(menustrip?),剩下的就是'儿童形式'。
这个想法是,单击菜单中的一个元素(记住,主窗体的左侧),它将创建并实例化一个表单,并在内容侧(右侧)显示它。
在内容方面(右侧)同时只有一个表单,但我可能需要ShowDialog属性来创建一个新表单,与主表单分开。
问题:
我不知道在mainform中我应该使用哪个控件来在mainform的右侧放置一个'contentplaceholder'(类似于asp.net),这样我就可以通过单击来动态加载/卸载表单在菜单的元素中。
我知道如何打开一个新对话框(form.ShowDialog等等),但我不记得是否可能。
答案 0 :(得分:2)
这是一种非常常见的用户界面模型。首先在表单上删除SplitContainer,它会为您提供两个面板和一个可以调整的分隔符。在左侧面板上放置一个TreeView,它提供导航。将其Dock属性设置为Fill。添加一些节点,它们将是'菜单项'。您可以使用图标和嵌套节点任意使用它。
您通过为树视图的AfterSelect事件实现事件处理程序来响应用户所做的选择。使用节点的Tag或Text属性识别单击的节点。像这样:
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设计师中表现得很好,让您专注于他们的外观。像这样:
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 :(得分:1)
你的英语实际上非常好。您可能想要做的不是让每个菜单项都显示新的Form
,而是让它创建一个新的Control
。由于您一次只想打开一个,因此您可以在主窗口的右侧添加一个面板,并在该面板中添加简单的交换控件。因此,当点击MenuItem1
时:
MyControl1 newControl= new MyControl1();
newControl.Dock = DockStyle.Fill;
placeHolderPanel.Controls.Clear();
placeHolderPanel.Controls.Add(newControl);
答案 2 :(得分:0)
我同意汉斯的所有内容,除了我想补充一点,因为你想使用将放在主窗体而不是CONTROLS上的FORMS,你可能需要这样的东西:
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;
}
它将有效地允许您使用占位符并将基于窗体的窗口替换为它!