Как сделать так, чтобы текст флажков автоматически переносился при изменении ширины формы?

В формах Windows у меня есть список флажков, содержащий длинный текст, размер формы можно изменять.

Могу ли я сделать автоматический перенос текста во время выполнения в соответствии с шириной формы?


person Emad Khalil    schedule 27.10.2014    source источник
comment
Если вы не боитесь делать настраиваемый контроль, то уверены, что все умеете. Одна возможность, однако, может быть простой: измерить текст и самостоятельно разместить новые строки (идея украдена из этого ответа).   -  person Sinatr    schedule 27.10.2014
comment
@Sinatr Я могу использовать настраиваемый элемент управления, но большинство решений, которые я нашел, обертывают текст в начале при инициализации элемента управления, а затем фиксируются навсегда, даже когда я меняю ширину формы.   -  person Emad Khalil    schedule 27.10.2014
comment
Спасибо за помощь, но текст динамически поступает из базы данных, я не могу его изменить @Sinatr   -  person Emad Khalil    schedule 27.10.2014
comment
У меня есть список флажков. Поскольку вы упомянули, что текст флажков поступает из базы данных, возможно, DataGridView с CheckBoxColumn и TextBoxColumn будет лучшим подходом. DataGridViewCellStyle иметь собственность WrapMode   -  person Fabio    schedule 30.10.2014
comment
да, спасибо за помощь @TaW   -  person Emad Khalil    schedule 04.11.2014


Ответы (3)


Вы можете использовать:

  1. установите для autosize значение false

  2. измените ширину "MaximumSize" на желаемую ширину этикетки, скажем, "70"

  3. измените высоту MinimumSize на желаемую высоту ярлыка, скажем, 30

person Joseph Wu    schedule 20.07.2015
comment
Я использовал панель макета таблицы в качестве контейнера и установил для свойства AutoSize флажка значение true. Это исправило изменение. - person Adam L. S.; 27.07.2021

Чтобы обернуть Text, вам нужно сделать свойство AutoSize ложным и разрешить больший Height:

checkBox1.AutoSize = false;
checkBox1.Height = checkBox1.Height * 3; // or however many lines you may need

// style the control as you want..
checkBox1.CheckAlign = ContentAlignment.TopLeft;
checkBox1.TextAlign = ContentAlignment.TopLeft;
checkBox1.Anchor = AnchorStyles.Right;

checkBox1.Text = "12321312231232 13189892321 312989893123 ";

Вам нужно будет подумать о вертикальной компоновке ..

Может быть, в этом поможет FlowLayoutPanel, или, может быть, вы захотите измерить необходимый размер с помощью Graphics.MeasureString или TextRenderer.MeasureText(String, Font, Size)!

person TaW    schedule 27.10.2014
comment
Большое спасибо, но я думаю, что это обернет текст при инициализации элемента управления, а затем будет исправлен навсегда, но я хочу автоматически настроить обертку во время выполнения приложения, если пользователь изменяет ширину формы - person Emad Khalil; 27.10.2014
comment
В этом случае вам также нужно будет привязать флажок, но тогда упаковка будет динамически адаптирована .. Я добавил необходимую строку .. - person TaW; 27.10.2014
comment
На самом деле вам не нужно менять CheckAlign, TextAlign и Anchor. Эти свойства имеют отношение только к эстетике (CheckAlign и TextAlign) и динамической компоновке (Anchor). Более того, если вы не привяжете якорь слева, ваш флажок не изменится, когда ширина родительского элемента увеличится. - person Simone; 23.05.2017
comment
Вы правы, но на самом деле я не говорил, что они нужны; Я упоминаю их как примеры того, как стилизовать элемент управления. Какой вид анкеровки нужен, всегда решает проектировщик. - person TaW; 23.05.2017

Я пробовал много подходов, но, наконец, этот сработал после множества исследований: -

просто я использовал два события, чтобы определить изменение размера панели, содержащей элементы управления, и соответствующим образом настроил элементы управления.

первое событие - это LayoutEventHandler , второе событие для обнаружение изменения разрешения

в этих событиях: -

1- получить ширину панели с учетом разрешения (нижнее допустимое разрешение - 1024x768)

  Rectangle resolution = Screen.PrimaryScreen.Bounds;
  int panelWidth *= (int)Math.Floor((double)resolution.Width / 1024);

2- цикл на все элементы управления и отрегулируйте ширину элемента управления, чтобы она соответствовала ширине панели (я вычел 10 пикселей для ширины вертикальной прокрутки), затем я получил высоту элемента управления из функция MeasureString, которая берет на себя управление текста, шрифта и ширины элемента управления и вернуть размер элемента управления.

(т.е. я умножил высоту примерно на коэффициент 1,25, чтобы преодолеть высоту строки и отступы)

  foreach (var control in controls)
  {
      if (control is RadioButton || control is CheckBox)
      {
             control.Width = panelWidth - 10;

             Font fontUsed = control.Font;
             using (Graphics g = control.CreateGraphics())
             {
               SizeF size = g.MeasureString(control.Text, fontUsed, control.Width);
              control.Height = (int)Math.Ceiling(size.Height * 1.25);
            }
       }
  }
person Emad Khalil    schedule 04.11.2014
comment
Этот метод излишне реализует динамический макет вручную, где есть более эффективные способы, такие как привязка или стыковка. - person Simone; 23.05.2017