Выравнивание по правому краю в WinForms
Самый очевидный способ выравнивания по правому краю Label
в WinForms не работает: установка привязки в верхнее/нижнее правое и TextAlign в TopRight. Если текст изменяет метку, левая координата остается неизменной, а не правой (что можно утверждать, является ошибкой).
По этой причине я всегда использовал полноразмерную TableLayoutPanel
для выровненных по правому краю меток. Однако это не всегда очень удобно, в зависимости от рассматриваемого макета...
Итак, мне интересно, есть ли другие способы сохранить выравнивание Label в WinForms, которое мне никогда не приходило в голову?
Ответы
Ответ 1
Один простой вариант - отключить AutoSize
(установить на false
) и перемасштабировать его, чтобы было свободное место.
В качестве альтернативы, возможно, вместо Anchor
используйте Dock
, хотя это имеет другое значение, поэтому вам может потребоваться поместить его в Panel
или подобное). В конечном счете это работает как первое - путем чрезмерного его определения в первую очередь; поэтому, возможно, первый вариант проще.
Ответ 2
Использование TableLayoutPanel с прикрепленными ярлыками - единственный надежный метод, который я нашел для размещения выровненных по правому краю меток в Winforms. Отключение AutoSize и использование негабаритных ярлыков, по-видимому, вызывают необычные аномалии для пользователей с высоким уровнем DPI.
Ответ 3
Использование FlowLayoutPanel для этого очень хорошо работает.
flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
flowLayoutPanel2.Controls.Add(label);
Затем просто убедитесь, что flowLayoutPanel достаточно велик для расширения ярлыка.
Ответ 4
Вот что сработало для меня в стандартной форме
- Устанавливает свойство AutoSize для выравнивания по ярлыкам.
- Сделайте все поля одинакового размера (возможно, это не обязательно) с помощью панели инструментов "Макет"
- Multi-select ярлыки и выравнивание по правому краю с помощью панели инструментов Layout, положение по желанию
- Установите свойство TextAlign в одну из настроек xxxRight, например TopRight
Ответ 5
Хорошо, поскольку 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;
}
Ответ 6
если вы установите свойство формы 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;
Ответ 7
Лучшим решением для меня было:
- Установите метки свойств AutoSize в значение false. Установите TextAlign
- метки свойств для чего-то справа.
- Измените размер вручную
метки 1 на 1, чтобы они могли использовать больше места.
Ответ 8
Прикрепите обработчик события к событию 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);
чтобы выровнять сторону RH dgv.
(BTW: Я пробовал события Paint и TextChanged, но они, похоже, иногда путаются - возможно, что-то связано с порядком события, особенно при открытии новой формы.)
Ответ 9
- Динамически созданная метка default autosize имеет значение false.
- Если label autosize имеет значение false. он содержит дополнительное пустое пространство.
- что позволяет вам думать, что он не правильно выравнивается. для его диагностики,
установите метку backColour на светло-зеленый.
![введите описание изображения здесь]()
int rowIndex=1;
var lbx = new Label();
lbx.AutoSize = true; // default is false.
lbx.BackColor = Color.Green; // to see if it 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 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);