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注意到你必须:
- 将
AutoSize
设置为false - 将
TextAlign
设置为Right,例如MiddleRight
- 使用
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是:
- 将AutoSize属性标签设置为false。 设置TextAlign
- 财产标签的东西在右边。
- 手动调整标签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);