【问题标题】:C# Unable to dynamicly auto-size columns evenly in TableLayoutPanelC# 无法在 TableLayoutPanel 中动态地自动调整列的大小
【发布时间】:2016-10-06 08:22:15
【问题描述】:

我有一个带有TableLayoutPanel 控件的 WinForm。我的代码将检测屏幕上连接的监视器的数量,为每个监视器创建一个列,然后在TableLayoutControl 的每个单独列中为每个显示添加一个按钮,这样我就可以确保无论连接了多少个监视器,按钮将在表单中“居中”显示。一/两个监视器渲染得很好,但是三个监视器导致端列分布不均。

这是我的代码:

            int count = Screen.AllScreens.Count();
            this.monitorLayoutPanel.ColumnCount = count;

            ColumnStyle cs = new ColumnStyle(SizeType.Percent, 100 / count);
            this.monitorLayoutPanel.ColumnStyles.Add(cs);

            this.monitorLayoutPanel.AutoSize = true;

            var buttonSize = new Size(95, 75);

            int z = 0;
            foreach (var screen in Screen.AllScreens.OrderBy(i => i.Bounds.X))
            {

                Button monitor = new Button
                {
                    Name = "Monitor" + screen,
                    AutoSize = true,
                    Size = buttonSize,

                    BackgroundImageLayout = ImageLayout.Stretch,                                                  
                    BackgroundImage = Properties.Resources.display_enabled,
                    TextAlign = ContentAlignment.MiddleCenter,
                    Font = new Font("Segoe UI", 10, FontStyle.Bold),
                    ForeColor = Color.White,
                    BackColor = Color.Transparent,
                    Text = screen.Bounds.Width + "x" + screen.Bounds.Height,
                    Anchor = System.Windows.Forms.AnchorStyles.None
                };


                this.monitorLayoutPanel.Controls.Add(monitor, z, 0);
                z++;
                monitor.MouseClick += new MouseEventHandler(monitor_Click);
            }

我尝试过缩小按钮并增加表单大小,但最后一列总是比前两列小。我无法理解!

【问题讨论】:

标签: c# winforms tablelayoutpanel


【解决方案1】:

先清除列样式。

this.monitorLayoutPanel.ColumnStyles.Clear();

然后:

int count = Screen.AllScreens.Count();

for (int i = 0; i < count; i++)
{
    ColumnStyle cs = new ColumnStyle(SizeType.Percent, (float)100 / count);
    this.monitorLayoutPanel.ColumnStyles.Add(cs);
}

this.monitorLayoutPanel.AutoSize = true;

...

【讨论】:

  • 感谢您的建议。它使最后两列更加均匀,但是所有三列仍然不均匀分布:screenshot
  • 可能是float参数的原因。
  • @MSL 是的,ColumnStyles 首先应该被清除。对于这个问题,我会将按钮列表保留在表单like this 的底部中心。
【解决方案2】:

Reza Aghaei 将我指向此线程 How to create a magic square using Windows Forms?,它为我指明了正确的方向。下面更新(和工作)代码。 :)

            int screens = Screen.AllScreens.Count();
            this.monitorLayoutPanel.ColumnStyles.Clear();
            this.monitorLayoutPanel.ColumnCount = screens;            
            this.monitorLayoutPanel.AutoSize = true;

            int z = 0;
            foreach (var screen in Screen.AllScreens.OrderBy(i => i.Bounds.X))
            {
                var percent = 100f / screens;
                this.monitorLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, percent));

                Button monitor = new Button
                {
                    Name = "Monitor" + screen,
                    Size = new Size(95, 75),
                    BackgroundImageLayout = ImageLayout.Stretch,                                                  
                    BackgroundImage = Properties.Resources.display_enabled,
                    TextAlign = ContentAlignment.MiddleCenter,
                    Font = new Font("Segoe UI", 10, FontStyle.Bold),
                    ForeColor = Color.White,
                    BackColor = Color.Transparent,
                    Text = screen.Bounds.Width + "x" + screen.Bounds.Height,
                    Anchor = System.Windows.Forms.AnchorStyles.None
                };


                this.monitorLayoutPanel.Controls.Add(monitor, z, 0);
                z++;
                monitor.MouseClick += new MouseEventHandler(monitor_Click);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多