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

时间:2011-05-14 13:23:29

标签: c# .net winforms menu

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

我在想有一个MainForm,将它分成两边:左边(约占屏幕宽度的20%),它将包含一个MENU(menustrip?),剩下的就是'儿童形式'。

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

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

问题:

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

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

3 个答案:

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

它将有效地允许您使用占位符并将基于窗体的窗口替换为它!