【问题标题】:Dynamic Control Positioning动态控制定位
【发布时间】:2014-03-23 23:39:21
【问题描述】:

我正在尝试在页面上动态定位控件,当宽度小于控件的总宽度时,我已经掌握了将控件“包装”到下一行的窍门。 我现在遇到的问题是间距是否正确。

我目前有以下;

 public void AddControl(Control controlToAdd, int parentWidth, int allRowsHeight)
 {
     RowControls.Add(controlToAdd);

     int seperationWidth = (parentWidth - RowControls.Sum(c => c.Width)) / (RowControls.Count + 1);
     int count = 0;
     foreach (Control c in RowControls)
     {
         int xLocation = (seperationWidth*(count+1));
         for (int i = 0; i < count; i++)
         {
             xLocation += (RowControls[i].Width);
         }
         c.Location = new Point(xLocation, allRowsHeight);
         count++;
     }
 }

几乎有效,但从屏幕截图中可以看出,控件有点过头了,我不太确定这是为什么? “换行”检查基本上是对seperationWidth 行的重复,它确保最小间距为 1,即如果间距小于 1,则改为“换行”。

也许有一种完全不同的更好的方法来做到这一点?如果有人熟悉的话,我也可以访问 DevExpress。

编辑:
怀疑我的方法存在舍入问题。不知道我怎么能绕过它;
在本例中,seperationWidth 为 7,控件宽度为 128。
7+128+7+128+7+128+7+128+7=547。 不过不确定如何解决这个问题?

【问题讨论】:

  • 您不只是使用 FlowLayoutPanel 是否有特殊原因?
  • 当我以编程方式添加控件时,是否会像我尝试做的那样自动布局控件?
  • 如果没有,我为什么会提到它。阅读该类的 MSDN 文档,这应该是您在指向新类型或新成员时要做的第一件事。
  • 这是一个开始。虽然看不到任何使其成为中心控件的选项。我明白了; imgur.com/i1ETkas 但我想要这个; imgur.com/3tpfHli
  • 嗯...老实说,我自己从未使用过 FLP,但我没想到它可以做到这一点。

标签: c# winforms layout dynamic controls


【解决方案1】:

好的,所以这里的问题是我将Width 属性传递给parentWidth 参数。我真正需要做的是传递ClientSize.Width 属性。这解决了问题,按钮现在布局正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多