C# 如何更改控件';s大小并在窗体最小化时添加新控件
我有一个windows窗体,里面有两个面板,一个占据窗体的左半部分,一个占据窗体的右半部分。现在,当我的程序中发生某个事件时(例如,我从服务器收到一条消息),我想在现有的两个控件之间添加一个新控件(比如第三个面板),因此我需要将它们变小,并将它们移到窗体的两侧 这可能发生在表单最小化时,这就是我的问题所在。当窗体最小化时,PanelsC# 如何更改控件';s大小并在窗体最小化时添加新控件,c#,winforms,C#,Winforms,我有一个windows窗体,里面有两个面板,一个占据窗体的左半部分,一个占据窗体的右半部分。现在,当我的程序中发生某个事件时(例如,我从服务器收到一条消息),我想在现有的两个控件之间添加一个新控件(比如第三个面板),因此我需要将它们变小,并将它们移到窗体的两侧 这可能发生在表单最小化时,这就是我的问题所在。当窗体最小化时,PanelsSize返回[0,0],因此我无法将其用于计算 所以我的第一个问题是,当窗体最小化时,如何获得控件的“原始”大小 然后,即使我以某种方式计算了新的尺寸(假设我有40
Size
返回[0,0],因此我无法将其用于计算
所以我的第一个问题是,当窗体最小化时,如何获得控件的“原始”大小
然后,即使我以某种方式计算了新的尺寸
(假设我有400px宽的形状和2x 200px的面板,我希望新的第三个面板是200px宽,因此旧面板将变为100px宽),并应用它:
leftPanel.Size = new Size(100, 100);
然后,将窗体从最小化状态恢复到正常状态后,面板将比指定的100x100大很多。似乎它将恢复为表单ClientSize+新指定的大小
因此,我的问题是:如何在窗体最小化时添加和调整控件的形状?< /P> < P>示例程序,以调整在窗体中托管的面板的大小,并在两个现有的中间插入新的面板时,调整布局。 托管表单的
WindowState
不相关(可以最小化、最大化或处于正常状态)
► 使用第一种方法,如果形状最大化,面板将保持初始高度。
► 使用第二种方法,就像现在一样,面板的高度将设置为表单的
ClientSize.Height
。当然可以更改,将TableLayoutPanel行设置为绝对高度,而不是自动调整大小
仅使用停靠功能:
- 设置表单
AutoSizeMode=Dpi
- 向表单中添加两个面板(例如,
和panelLeft
)panelRight
- 将两个面板的宽度设置为
200
- 将
设置为panelLeft
和Dock=DockStyle.Left
设置为panelRight
Dock=DockStyle.Right
- 右键单击左侧的面板并选择发送备份(
)!重要信息
- 调整表单大小:它应该是:
。不重要,只是为了视觉确认(418138)
- 在构造器集合
this.ClientSize=新大小(400100)的形式中代码>
- 向表单中添加新的公共方法:
public void AdjustPanelsWidth(int newWidth) { this.panelLeft.Width = newWidth; this.panelRight.Width = newWidth; }
public void AddControl(Control control) { // Add a Control to Column 1 - Row 0 this.tableLayoutPanel1.Controls.Add(control, 1, 0); panel.Dock = DockStyle.Fill; }
当您需要在两个现有面板中间添加一个新的面板时:
(
someForm
表示最小化表单的当前实例)
使用TableLayoutPanel:
- 在表单中添加一个
- 将其设置为
Dock=DockStyle.Top
- 编辑列和行,使其具有3列和1行
- 将TLP设计器中的柱样式设置为:
栏目:
- (0)百分之五十
- (1) 自动调整大小
- (2) 百分之五十
- (0)自动调整大小
0
- 将两个面板添加到表单(而不是直接添加到TableLayoutPanel)
- 设置面板的大小=(200100)
- 将一个面板拖动到TLP左侧列内,将另一个面板拖动到右侧列上
- !!在VS属性面板中,验证左侧面板的Column属性是否为Column 0 右侧的面板也是如此:Colum属性必须是第2列 如果列错误,请手动编辑
- 选择两个面板,并将其设置为
(现在您应该看到TLP完全由面板填充,两者都占TLP大小的50%)Dock=DockStyle.Fill
- 像以前一样调整表单大小(实际上仍然不重要)
- 在构造器集合
this.ClientSize=新大小(400100)的形式中代码>(如前所述)
public void AdjustPanelsWidth(int newWidth)
{
this.panelLeft.Width = newWidth;
this.panelRight.Width = newWidth;
}
public void AddControl(Control control)
{
// Add a Control to Column 1 - Row 0
this.tableLayoutPanel1.Controls.Add(control, 1, 0);
panel.Dock = DockStyle.Fill;
}
在中间列中添加一个新的面板:
var p = new Panel() {
Size = new Size(200, 100),
BackColor = Color.Red,
Margin = new Padding(0)
};
someForm.AddControl(p);
实现所述TableLAyoutPanel方法的窗体的结构:
ClockMinimize()=>
最小化时钟大小,将其压缩在其他两个面板之间
ClockShow()=>
将时钟放大,以与其他面板重叠,从而调整大小以完全填充表单的客户端区域:
示例程序以调整在窗体中承载的面板,并在两个现有的中间插入新的面板时调整布局。 托管表单的
WindowState
不相关(可以最小化、最大化或处于正常状态)
► 使用第一种方法,如果形状最大化,面板将保持初始高度。
► 使用第二种方法,就像现在一样,面板的高度将设置为表单的
ClientSize.Height
。当然可以更改,将TableLayoutPanel行设置为绝对高度,而不是自动调整大小
仅使用停靠功能:
- 设置表单
AutoSizeMode=Dpi
- 向表单中添加两个面板(例如,
和panelLeft
)panelRight
- 将两个面板的宽度设置为
200
- 将
设置为panelLeft
和Dock=DockStyle.Left
设置为panelRight
Dock=DockStyle.Right
- 右键单击左侧的面板并选择发送备份(
)!重要信息
- 调整表单大小:它应该是:
。不重要,只是为了视觉(418138)
public void changeControlPositionAndSize() { //calculate new size and location based on size and location of neighboring controls myPanel.Location = ... myPanel.Size = ... }
public async Task changeControlPositionAndSize() { while (WindowState == FormWindowState.Minimized) { await Task.Delay(2000); } //calculate new size and location based on size and location of neighboring controls myPanel.Location = ... myPanel.Size = ... }