Как изменить размер кнопки в зависимости от ее текста

В процессе перевода приложения с С# + Winforms мне нужно изменить текст кнопки в зависимости от языка.

Моя проблема заключается в следующем:

Скажем, я хочу перевести кнопку "Привет всем!". на "Bonjour tout le monde"!

Как вы можете догадаться, размер кнопки не будет одинаковым, если я ввешу английский текст или французский... Мой вопрос "прост", как я могу изменить размер кнопки "на лету", поэтому текст подходит его содержимое в кнопке?

До сих пор я получил что-то подобное!

[Привет всем!]

[Бонжур]

Ответы

Ответ 1

Лучше всего установить свойство AutoSize, как описано ach answer

Однако, если AutoSize не работает для вас, изменение размера кнопки в коде достаточно просто. Вам просто нужно установить ширину кнопки. Трюк делает его достаточно большим, чтобы соответствовать вашему тексту.

   using(Graphics cg =  this.CreateGraphics())
   {
       SizeF size = cg.MeasureString("Please excuse my dear aunt sally",this.button1.Font);

       // size.Width+= 3; //add some padding .net v1.1 and 1.0 only
       this.button1.Padding = 3;
       this.button1.Width = (int)size.Width;

       this.button1.Text = "Please excuse my dear aunt sally";
   }

Ответ 2

Абсолютно не нужно использовать базовый объект Graphics, как говорили другие плакаты.

Если для свойства кнопки AutoSize установлено значение true, от AutoSizeMode до GrowAndShrink и AutoEllipsis до значения false, оно будет автоматически изменяться в соответствии с текстом.

При этом вам может потребоваться внести несколько корректировок макета, чтобы это изменение соответствовало вашему пользовательскому интерфейсу. Вы можете настроить добавление кнопок, чтобы добавить пространство вокруг текста, и вы можете поместить свои кнопки в TableLayoutPanel (или что-то еще), чтобы они не перекрывались при изменении размера.

Изменить: @mastro отметил, что: AutoEllipsis действует только тогда, когда AutoSize false (Как объясняется в документации), поэтому он может быть безопасно проигнорировано, если все три свойства установлены правильно.

Ответ 3

Попробуйте следующее:

Button.AutoSize = true;
Button.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly;
Button.TextAlign = ContentAlignment.MiddleLeft;
Button.Padding = new Padding(0, 0, 0, 0);

Ответ 4

Как Andrew Hanlon объясняет, вы можете установить AutoSize = true.

При этом вы также можете автоматически создать идеальный макет кнопок, разместив их на FlowLayoutPanel.

Горизонтальное расстояние между ними всегда будет оставаться неизменным, если FlowDirection FlowLayoutPanel равно LeftToRight или RightToLeft. Вы можете отрегулировать это расстояние, установив свойство Margin кнопок соответствующим образом. Вы можете создавать группы кнопок, увеличивая левое поле кнопок, начинающих новую группу.

Если вы установите для свойства Dock для кнопок DockStyle.Fill, они будут даже автоматически увеличивать свою ширину, чтобы соответствовать самой широкой кнопке, если FlowDirection FlowLayoutPanel - TopDown или BottomUp.

btn.AutoSizeMode = AutoSizeMode.GrowOnly;
btn.AutoSize = true;
btn.Dock = DockStyle.Fill;