在WinForms中右对齐Label
的最明显方法不起作用:将anchor设置为Top / Bottom Right,TextAlign设置为TopRight。如果文本改变了标签的左坐标保持不变而不是右坐标(人们可能认为这是一个错误)。
出于这个原因,我总是使用全宽TableLayoutPanel
作为右对齐标签。然而,这并不总是非常方便,具体取决于所讨论的布局......
所以,我想知道是否还有其他方法可以让我在WinForms中保持一个从未发生过对齐的标签?
答案 0 :(得分:50)
一个简单的选项是禁用AutoSize
(设置为false
)并使其超大,以便有空余空间。
或者,也许使用Dock
而不是Anchor
,虽然这有不同的含义,因此您可能需要将其放在Panel
或类似的内容中。最终,这就像第一个一样 - 首先是过度调整它;所以也许第一种选择更简单。
答案 1 :(得分:9)
使用带有停靠标签的TableLayoutPanel是我在Winforms中放置右对齐标签时唯一可靠的方法。关闭AutoSize并使用超大标签似乎会导致高DPI用户出现奇怪的异常。
答案 2 :(得分:8)
使用FlowLayoutPanel可以很好地完成它。
flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
flowLayoutPanel2.Controls.Add(label);
然后,只需确保flowLayoutPanel足够大,以便标签扩展。
答案 3 :(得分:7)
这是在标准表格上对我有用的内容
答案 4 :(得分:1)
好Sphax注意到你必须:
AutoSize
设为false TextAlign
设置为右,例如设置为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;
}
答案 5 :(得分:0)
如果你设置表格属性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;
答案 6 :(得分:0)
对我来说最好的解决方案是:
答案 7 :(得分:0)
将事件处理程序附加到标签' 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);
与dgv的右侧对齐。
(顺便说一句:我尝试过Paint& TextChanged事件,但他们似乎有时会感到困惑 - 可能与事件顺序有关,特别是在打开新表格时。)
答案 8 :(得分:0)
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);