如何在 MDI 中正确显示 child 侧栏和 child 表单在 Windows 表单应用程序中?
How to properly display in MDI a child side bar and a child form in a Windows Form Application?
我正在尝试布局具有一个 child 侧边栏形式和多个 child 形式的 MDI。
当点击排列按钮时,我试图让布局如以下屏幕截图所示(边栏和最顶部打开 child 并排显示):
初始化侧边栏
sideBarForm = new Form();
sideBarForm.MdiParent = this;
sideBarForm.Show();
sideBarForm.Dock = DockStyle.Right;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Name = "sideBarForm";
添加新的child
Form childForm = new Form();
childForm.MdiParent = this;
childForm.Show();
排列布局
private void Arrange_Click(object sender, EventArgs e)
{
foreach (Form child in MdiChildren)
{
if (child.Name != sideBarForm.Name)
{
child.WindowState = FormWindowState.Normal;
child.Width = this.ClientRectangle.Width - sideBarForm.Width - 50;
child.Height = this.ClientRectangle.Height - 150;
}
}
}
为了使两个表格正确并排显示,需要 "play" 加上数字。对于宽度,我删除了 50px,对于高度,我删除了 150px。
将两种形式并排放置的正确方法是什么?
注意:MDI 可以包含多个打开的窗体,所以我不能使用 SplitContainer 或 TableLayoutPanel 例如。
创建一个mdi 窗体并在其中添加一个面板,并将面板的停靠栏属性 设置到右侧。它将变成如下屏幕截图:
使用
LayoutMdi(MdiLayout.TileVertical);
事件代码如下图所示:
在您的 MDI 表单上。它将在 MDI window 中并排排列所有打开的表单。最终屏幕截图将如下所示:
您可以使用两个面板(一个 DockStyle.Right 和另一个 DockStyle.Fill),并向面板添加子表单,例如:
sideBarForm = new Form();
sideBarForm.MdiParent = this;
panelRight.Controls.Add(sideBarForm);
sideBarForm.Show();
sideBarForm.Dock = DockStyle.Fill;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Name = "sideBarForm";
Form childForm = new Form();
childForm.MdiParent = this;
panelLeft.Controls.Add(childForm);
childForm.Show();
此致!
鉴于您显示的布局,在其 Resize 事件中将 SideBarForm
宽度重置为所需的尺寸应该就足够了。
首先将 SideBarForm
表单添加到 MDIChildren
集合中,将其停靠在您需要的一侧,然后 SendToBack()
.这将使工具栏在停靠堆栈中具有更高的优先级。
另一个 MDI 子窗体将被停靠以填充剩余的 space。
当 MDIParent
调整大小或最大化时,将保持配置。
在MDIParent
表格中:
private int sideBarSize = 150;
private void MDIParent_Load(object sender, EventArgs e)
{
this.MinimumSize = new Size(sideBarSize * 2, sideBarSize * 2);
SideBarForm sideBarForm = new SideBarForm(sideBarSize);
ChildForm childForm = new ChildForm();
sideBarForm.MdiParent = this;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Size = new Size(sideBarSize, this.ClientRectangle.Height);
sideBarForm.Dock = DockStyle.Right;
sideBarForm.SendToBack();
sideBarForm.Show();
childForm.MdiParent = this;
childForm.BringToFront();
childForm.Dock = DockStyle.Fill;
childForm.Show();
}
在SideBarForm
中:
private int myWidth = 0;
public SideBarForm() : this(150) { }
public SideBarForm(int MySize)
{
InitializeComponent();
this.myWidth = MySize;
this.Width = MySize;
}
private void SideBarForm_Resize(object sender, EventArgs e)
{
this.Width = myWidth;
}
Mdi window 尊重停靠内容并将剩余区域用于 mdi 子 windows。
因此,对于边栏,不要将其添加为 mdi window,而是将其添加为停靠 window。对于 windows 的其余部分,将它们添加为 mdi child windows:
private void Form1_Load(object sender, EventArgs e)
{
IsMdiContainer = true;
var sideBar = new Form();
sideBar.Text = "SideBar";
sideBar.TopLevel = false;
sideBar.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBar.Dock = DockStyle.Right;
this.Controls.Add(sideBar);
var f1= new Form();
f1.Text = "Mdi Child 1";
f1.MdiParent = this;
var f2 = new Form();
f2.Text = "Mdi Child 2";
f2.MdiParent = this;
sideBar.Show();
f1.Show();
f2.Show();
}
我正在尝试布局具有一个 child 侧边栏形式和多个 child 形式的 MDI。
当点击排列按钮时,我试图让布局如以下屏幕截图所示(边栏和最顶部打开 child 并排显示):
初始化侧边栏
sideBarForm = new Form();
sideBarForm.MdiParent = this;
sideBarForm.Show();
sideBarForm.Dock = DockStyle.Right;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Name = "sideBarForm";
添加新的child
Form childForm = new Form();
childForm.MdiParent = this;
childForm.Show();
排列布局
private void Arrange_Click(object sender, EventArgs e)
{
foreach (Form child in MdiChildren)
{
if (child.Name != sideBarForm.Name)
{
child.WindowState = FormWindowState.Normal;
child.Width = this.ClientRectangle.Width - sideBarForm.Width - 50;
child.Height = this.ClientRectangle.Height - 150;
}
}
}
为了使两个表格正确并排显示,需要 "play" 加上数字。对于宽度,我删除了 50px,对于高度,我删除了 150px。
将两种形式并排放置的正确方法是什么?
注意:MDI 可以包含多个打开的窗体,所以我不能使用 SplitContainer 或 TableLayoutPanel 例如。
创建一个mdi 窗体并在其中添加一个面板,并将面板的停靠栏属性 设置到右侧。它将变成如下屏幕截图:
使用
LayoutMdi(MdiLayout.TileVertical);
事件代码如下图所示:
在您的 MDI 表单上。它将在 MDI window 中并排排列所有打开的表单。最终屏幕截图将如下所示:
您可以使用两个面板(一个 DockStyle.Right 和另一个 DockStyle.Fill),并向面板添加子表单,例如:
sideBarForm = new Form();
sideBarForm.MdiParent = this;
panelRight.Controls.Add(sideBarForm);
sideBarForm.Show();
sideBarForm.Dock = DockStyle.Fill;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Name = "sideBarForm";
Form childForm = new Form();
childForm.MdiParent = this;
panelLeft.Controls.Add(childForm);
childForm.Show();
此致!
鉴于您显示的布局,在其 Resize 事件中将 SideBarForm
宽度重置为所需的尺寸应该就足够了。
首先将 SideBarForm
表单添加到 MDIChildren
集合中,将其停靠在您需要的一侧,然后 SendToBack()
.这将使工具栏在停靠堆栈中具有更高的优先级。
另一个 MDI 子窗体将被停靠以填充剩余的 space。
当 MDIParent
调整大小或最大化时,将保持配置。
在MDIParent
表格中:
private int sideBarSize = 150;
private void MDIParent_Load(object sender, EventArgs e)
{
this.MinimumSize = new Size(sideBarSize * 2, sideBarSize * 2);
SideBarForm sideBarForm = new SideBarForm(sideBarSize);
ChildForm childForm = new ChildForm();
sideBarForm.MdiParent = this;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Size = new Size(sideBarSize, this.ClientRectangle.Height);
sideBarForm.Dock = DockStyle.Right;
sideBarForm.SendToBack();
sideBarForm.Show();
childForm.MdiParent = this;
childForm.BringToFront();
childForm.Dock = DockStyle.Fill;
childForm.Show();
}
在SideBarForm
中:
private int myWidth = 0;
public SideBarForm() : this(150) { }
public SideBarForm(int MySize)
{
InitializeComponent();
this.myWidth = MySize;
this.Width = MySize;
}
private void SideBarForm_Resize(object sender, EventArgs e)
{
this.Width = myWidth;
}
Mdi window 尊重停靠内容并将剩余区域用于 mdi 子 windows。
因此,对于边栏,不要将其添加为 mdi window,而是将其添加为停靠 window。对于 windows 的其余部分,将它们添加为 mdi child windows:
private void Form1_Load(object sender, EventArgs e)
{
IsMdiContainer = true;
var sideBar = new Form();
sideBar.Text = "SideBar";
sideBar.TopLevel = false;
sideBar.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBar.Dock = DockStyle.Right;
this.Controls.Add(sideBar);
var f1= new Form();
f1.Text = "Mdi Child 1";
f1.MdiParent = this;
var f2 = new Form();
f2.Text = "Mdi Child 2";
f2.MdiParent = this;
sideBar.Show();
f1.Show();
f2.Show();
}