【问题标题】:How to properly display in MDI a child side bar and a child form in a Windows Form Application?如何在 MDI 中正确显示 Windows 窗体应用程序中的子侧栏和子窗体?
【发布时间】:2019-06-15 19:50:46
【问题描述】:

我正在尝试布局具有一个子侧栏窗体和多个子窗体的 MDI。

点击排列按钮时,我试图让布局显示在以下屏幕截图中(侧栏和最顶部打开的子项并排显示):

初始化侧边栏

sideBarForm = new Form();
sideBarForm.MdiParent = this;    
sideBarForm.Show();
sideBarForm.Dock = DockStyle.Right;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Name = "sideBarForm";

添加新的孩子

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

为了使两种形式正确并排,它需要“玩”数字。对于宽度,我删除了 50 像素,高度为 150 像素。

将这两种表格并排放置的正确方法是什么?

注意:MDI 可以包含打开的多个表单,因此我不能使用例如 SplitContainer 或 TableLayoutPanel。

【问题讨论】:

    标签: c# winforms layout mdi


    【解决方案1】:

    Mdi 窗口尊重停靠的内容,并将剩余区域用于 mdi 子窗口。

    因此,对于侧边栏,不要将其添加为 mdi 窗口,而是将其添加为停靠窗口。对于其余的窗口,将它们添加为 mdi 子窗口:

    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();
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用两个面板(一个 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();
      

      问候!

      【讨论】:

      • 在调整表单大小时停靠它们会导致问题
      【解决方案3】:

      创建一个 mdi 表单并在其中添加一个面板并将面板的停靠属性设置为右。它将变成如下屏幕截图:

      使用

      LayoutMdi(MdiLayout.TileVertical);
      

      事件代码如下图所示:

      在您的 MDI 表单上。它将在 MDI 窗口中并排排列所有打开的表单。最终屏幕截图如下:

      【讨论】:

      • 是的,但它会使它们的大小相同,不像我发布的屏幕截图
      • 编辑了答案。
      【解决方案4】:

      鉴于您显示的布局,在其 Resize 事件中将 SideBarForm 宽度重置为所需的度量就足够了。

      首先将SideBarForm 表单添加到MDIChildren 集合中,将其停靠在您需要的一侧,然后SendToBack()。这将使工具栏在停靠堆栈中具有更高的优先级。

      另一个 MDI 子窗体将停靠以填充剩余空间。
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-05-31
        • 2019-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多