Подтвердить что ты не робот

Выравнивание по правому краю в WinForms

Самый очевидный способ выравнивания по правому краю Label в WinForms не работает: установка привязки в верхнее/нижнее правое и TextAlign в TopRight. Если текст изменяет метку, левая координата остается неизменной, а не правой (что можно утверждать, является ошибкой).

По этой причине я всегда использовал полноразмерную TableLayoutPanel для выровненных по правому краю меток. Однако это не всегда очень удобно, в зависимости от рассматриваемого макета...

Итак, мне интересно, есть ли другие способы сохранить выравнивание Label в WinForms, которое мне никогда не приходило в голову?

4b9b3361

Ответ 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);