C# 如何更改控件';s大小并在窗体最小化时添加新控件

C# 如何更改控件';s大小并在窗体最小化时添加新控件,c#,winforms,C#,Winforms,我有一个windows窗体,里面有两个面板,一个占据窗体的左半部分,一个占据窗体的右半部分。现在,当我的程序中发生某个事件时(例如,我从服务器收到一条消息),我想在现有的两个控件之间添加一个新控件(比如第三个面板),因此我需要将它们变小,并将它们移到窗体的两侧 这可能发生在表单最小化时,这就是我的问题所在。当窗体最小化时,PanelsSize返回[0,0],因此我无法将其用于计算 所以我的第一个问题是,当窗体最小化时,如何获得控件的“原始”大小 然后,即使我以某种方式计算了新的尺寸(假设我有40

我有一个windows窗体,里面有两个面板,一个占据窗体的左半部分,一个占据窗体的右半部分。现在,当我的程序中发生某个事件时(例如,我从服务器收到一条消息),我想在现有的两个控件之间添加一个新控件(比如第三个面板),因此我需要将它们变小,并将它们移到窗体的两侧

这可能发生在表单最小化时,这就是我的问题所在。当窗体最小化时,Panels
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)自动调整大小
关闭TLP设计器时,它应该看起来只有两列:因为中间的一列是自动调整大小的,并且没有内容,所以它的宽度当前为
0

  • 将两个面板添加到表单(而不是直接添加到TableLayoutPanel)
  • 设置面板的大小=(200100)
  • 将一个面板拖动到TLP左侧列内,将另一个面板拖动到右侧列上
  • !!在VS属性面板中,验证左侧面板的Column属性是否为Column 0 右侧的面板也是如此:Colum属性必须是第2列 如果列错误,请手动编辑
  • 选择两个面板,并将其设置为
    Dock=DockStyle.Fill
    (现在您应该看到TLP完全由面板填充,两者都占TLP大小的50%)
  • 像以前一样调整表单大小(实际上仍然不重要)
  • 在构造器集合
    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 = ...
        }