【问题标题】:Size adjustments for Panel control in windows formswindows窗体中面板控件的大小调整
【发布时间】:2015-01-31 18:34:40
【问题描述】:

我的 winform 上有一个面板控件,它将在其中显示多个面板。对于每个内部面板,我正在设置它的高度。但有些显示的内容较少,有些显示的内容较多。

Panel hrvPanel = new Panel();
ArrayList hrvColl = pnlColl ; //Panel collection list gets from a Method            
if(hrvColl.Count == 0)
            return;
        int splits = 0;
        for(int p= hrvColl.Count-1;p>=0;p--)
        {
            Panel hrv = hrvColl[p] as Panel;
            hrv.Height = 150;
            hrvPanel.Controls.Add(hrv);

            //Adding splliter
            if(splits < hrvColl.Count - 1)
            {
                Splitter splitGrid = new Splitter();
                splitGrid.Dock = DockStyle.Top;
                hrvPanel.Controls.Add(splitGrid);
                splits++;
            }
        }
  hrvPanel.Dock = DockStyle.Top;

如何根据内容大小调整每个内部面板的高度?我尝试将hrv.AutoSize设置为true,然后我只能看到最后一个面板和hrv.Dock = Top,但结果是一样的。

【问题讨论】:

  • 如果外面板有Autosize = true,您将能够看到所有内面板。如果你不这样做,你有一些设置错误。确保内部面板中没有使用 Dock 和 Anchor 的未经授权的设置。 - 编写一个函数来找出所有内部面板的最大顶部 + 高度也很简单,但这真的不需要!
  • 您的问题解决了吗?

标签: c# winforms panel


【解决方案1】:

如果外部Panel 具有Autosize = true,您将能够看到所有内部Panels。承诺。

如果你不这样做,你有一些设置错误。确保内部Panels 中没有使用不需要的Dock 和Anchor 设置。

编写代码来找出所有内部面板中Top + Height的最大值也很简单:

int max = 0;
foreach (Control ctl in panelOuter.Controls) 
   if (ctl.Top + ctl.Height > max) max = ctl.Top + ctl.Height;
panelOuter.Height = max + 3;  // add the default margin!

如果您只想设置 Height 并保留 Width 原样,这可能很有用..除此之外:AutoSize 属性将完成它的工作!

【讨论】:

    【解决方案2】:

    这是 WPF 克服 Winform 的地方,您可能无法在 Winforms 中自动执行此操作。但你可能有这样的解决方法-

    创建一个应该知道其首选高度的扩展面板类

    class ExPanel : Panel
    {
        public int PreferredHeight
        {
            get;
            private set;
        }
        public ExPanel(int preferredHeight)
            : base()
        {
            PreferredHeight = preferredHeight;
        }
    }
    

    然后你就可以使用这个类了-

    ExPanel hrvPanel = new ExPanel(150);
            System.Collections.ArrayList hrvColl = pnlColl; //Panel collection list gets from a Method            
            if (hrvColl.Count == 0)
                return;
            int splits = 0;
            for (int p = hrvColl.Count - 1; p >= 0; p--)
            {
                ExPanel hrv = hrvColl[p] as ExPanel;
                hrv.Height = hrv.PreferredHeight;
                hrvPanel.Controls.Add(hrv);
    
                //Adding splliter
                if (splits < hrvColl.Count - 1)
                {
                    Splitter splitGrid = new Splitter();
                    splitGrid.Dock = DockStyle.Top;
                    hrvPanel.Controls.Add(splitGrid);
                    splits++;
                }
            }
            hrvPanel.Dock = DockStyle.Top;
    

    如果您不想管理每个面板的高度,这只是实现目标的一种解决方法。

    【讨论】:

    • 不能根据内容大小调整每个面板的高度吗?
    • @M.K,是的,您必须手动完成。您必须在创建面板时手动设置它。此外,对于一些研发,您可以在将面板添加到父面板之前检查面板的 PreferredSize 是多少。
    • PreferredSize 始终显示 0,0。我现在手动设置 iheight 。但所有面板的值相同。因为我不知道会创建多少个面板。
    • 试试这个方法,如果可以的话可以使用。
    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多