WinForms中的右alignment标签

在WinForms中右alignmentLabel最明显的方法不起作用:将锚设置为Top / Bottom Right并将TextAlign设置为TopRight。 如果文本更改标签的左侧坐标保持不变,而不是右侧坐标(有人可能会认为这是一个错误)。

出于这个原因,我总是使用全angular的TableLayoutPanel来标记右alignment。 然而,这并不总是非常方便,这取决于所讨论的布局。

所以,我想知道是否还有其他方法可以使WinForms中的标签保持正确的alignment状态?

一个简单的select是禁用AutoSize (设置为false )并将其大小设置为有空余空间。

另外,也许使用Dock而不是仅仅是Anchor ,虽然这有不同的含义,所以你可能需要把它放在Panel或类似的地方)。 最终,这种方法就像第一个一样 – 首先是过大, 所以也许第一个select更简单。

使用带有停靠标签的TableLayoutPanel是我find的在Winforms中放置右alignment标签的唯一可靠的方法。 closuresAutoSize并使用超大标签似乎会导致高DPI用户出现奇怪的exception情况。

使用FlowLayoutPanel来做到这一点非常有效。

 flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; flowLayoutPanel2.Controls.Add(label); 

然后,只要确保flowLayoutPanel足够大,标签就可以展开。

这就是我在标准表格上的工作

  • 设置AutoSize属性只是为了使标签右alignment
  • 使用“布局”工具栏将所有字段的大小设置为相同(也许这不是必需的)
  • 多select标签,然后使用“布局”工具栏将其alignment,放在需要的位置
  • 将TextAlign属性设置为其中一个xxxRight设置,例如TopRight

就像Sphax注意到你必须:

  1. AutoSize设置为false
  2. TextAlign设置为Right,例如MiddleRight
  3. 使用MeasureString标签大小调整为实际大小

码:

 label.AutoSize = false; label.TextAlign = ContentAlignment.MiddleRight; int yourWidthHere = 100; using (Graphics g = label.CreateGraphics()) { SizeF size = g.MeasureString(text, label.Font, yourWidthHere); label.Height = (int)Math.Ceiling(size.Height); label.Text = text; } 

如果您设置窗体属性RightToLeft = yes; 所以你不应该使用Text Align属性来设置Anchor。 试试这个方法:

 Form.righttoleft = yes; label.anchor = Top, Right; label.TextAlign = TopLeft; 

要么

 Form.righttoleft = No; label.anchor = Top, Right; label.TextAlign = TopRight; 

要么

 Form.righttoleft = yes; label.righttoleft = No; label.anchor = Top, Right; label.TextAlign = TopRight; 

对我来说最好的解决scheme是:

  1. 将AutoSize属性标签设置为false。 设置TextAlign
  2. 财产标签的东西在右边。
  3. 手动调整标签1乘1,使他们可以使用更多的空间。

将一个事件处理程序附加到标签的SizeChanged事件:

 private void label1_SizeChanged(object sender, EventArgs e) { label1.Location = new Point(Your_Anchor_Point - label1.Width, label1.Location.Y); } 

为了更DPI友好考虑使用一些其他控制作为锚点,即

 label1.Location = new Point(dataGridView1.Location.X + dataGridView1.Width - label1.Width, label1.Location.Y); 

alignmentdgv的右侧。

(顺便说一句:我尝试了Paint&TextChanged事件,但是他们似乎有时会感到困惑 – 可能与事件顺序有关,特别是在打开一个新窗体时。

  • dynamic创build的标签的默认autosize为false。
  • 如果标签的autosize是假的。 它包含额外的空白空间。
  • 那会欺骗你认为它不正确的alignment。 诊断它,设置标签的背色为浅绿色

在这里输入图像说明

  int rowIndex=1; var lbx = new Label(); lbx.AutoSize = true; // default is false. lbx.BackColor = Color.Green; // to see if it's aligning or not lbx.Text = "Iam Autosize=true"; lbx.Anchor = AnchorStyles.Right; tlPanel.Controls.Add(lbx, 0, rowIndex); var dtp = new DateTimePicker(); dtp.Anchor = AnchorStyles.Left; tlPanel.Controls.Add(dtp, 1, rowIndex); //--- row 2 autosize false rowIndex=2; var lbx2 = new Label(); lbx2.AutoSize = false; // default is false. lbx2.BackColor = Color.Green; // to see if it's aligning or not lbx2.Text = "AutoSz=false"; lbx2.Anchor = AnchorStyles.Right; tlPanel.Controls.Add(lbx2, 0, rowIndex); var dtp = new DateTimePicker(); dtp.Anchor = AnchorStyles.Left; tlPanel.Controls.Add(dtp, 1, rowIndex);