2010-10-19 3 views
14

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

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

Скажем, я хочу, чтобы перевести кнопку из на «Bonjour tout le monde»!

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

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

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

[Bonjour]

ответ

19

Лучше всего установить AutoSize свойство, как описано ach's 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"; 
    } 
+0

спасибо! –

+0

Вам не нужно было добавлять прокладку? 'this.button1.Width = (int) size.Width + button1.Padding.Left + button1.Padding.Right;'. И если у вас есть изображение справа или слева от текста, вам нужно будет добавить ширину изображения. –

+0

@ OlivierJacot-Descombes Основываясь на [истории изменений] (http://stackoverflow.com/posts/3965742/revisions), я так и думал, а затем изменил свой ответ. Поскольку существует превосходный ответ (Andrew's), и любому, кто использует этот ответ, было бы легко определить, нужно ли вам учитывать заполнение размера или нет, я откажусь изменить этот ответ. –

24

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

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

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

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

+0

Для нужд ОП это может быть гораздо лучшее решение, потому что похоже, что они имеют дело с довольно простым секнарио. Однако утверждение «абсолютно не нужно» вводит в заблуждение. MeasureString - один из лучших инструментов, позволяющий программистам создавать собственные формы и элементы управления. Это также удобно для веб-программистов (через обработчик HTTP) для создания изображений с точным размером, основанных на переменном тексте. –

+2

@Tim - я не говорю ничего отрицательного о MeasureString, у него есть его использование, но это однозначно не одно из них. Прошивка вашего кода ненужным и произвольным (ширина + = 3) является плохой практикой. –

8

Попробуйте это:

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

Как 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; 
1

Для включения кнопки в WinForms расти и/или сжиматься в зависимости от размера текста, вам необходимо установить свойство AutoSize кнопки на True и AutoSizeMode свойство GrowAndShrink.

// C# 
btn.AutoSize = true; 
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink; 

' VB.NET 
btn.AutoSize = True 
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink 

Пожалуйста, обратите внимание, что AutoSize свойство только позволит размер баттона расти, если AutoSizeMode свойство установлено в GrowOnly; изменив свойство AutoSizeMode на GrowAndShrink, кнопка теперь будет автоматически расширяться или уменьшаться по ширине и высоте на основе ее Text.

Также обратите внимание, что при настройке двух свойств, как показано выше, вы можете использовать новые строки (Environment.NewLine или vbCrLf) в свойстве Текст, и кнопка будет уменьшаться по мере необходимости.

Смежные вопросы