如何根据其文本调整按钮的大小

Posted

技术标签:

【中文标题】如何根据其文本调整按钮的大小【英文标题】:How to resize a button depending on its text 【发布时间】:2011-04-27 07:30:47 【问题描述】:

在使用 C# + Winforms 翻译应用程序的过程中,我需要根据语言更改按钮的文本。

我的问题如下:

假设我想翻译“大家好!”中的一个按钮到“Bonjour tout le monde”!

您可以猜到,如果我输入英文文本或法文文本,按钮的大小将不一样...我的问题是“简单”,我怎样才能设法动态调整按钮的大小以使文本适合它在按钮中的内容?

到目前为止,我得到了类似的东西!

[大家好!]

[祝你好运]

【问题讨论】:

【参考方案1】:

绝对没有必要像其他发帖者所说的那样使用底层的Graphics 对象。

如果您将按钮的AutoSize 属性设置为true,将AutoSizeMode 设置为GrowAndShrink,并将AutoEllipsis 设置为false,它将自动调整大小以适应文本。

话虽如此,您可能需要进行一些布局调整,以使此更改适合您的 UI。您可以调整按钮的填充以在文本周围添加空间,并且您可能希望将按钮放在TableLayoutPanel(或其他东西)中以防止它们在调整大小时重叠。

编辑: @mastro 指出:AutoEllipsis 仅在AutoSizefalse 时有效(如the documentation 中所述),因此只要其他三个属性设置正确,就可以放心地忽略它。

【讨论】:

对于 OP 的需要,这可能是一个更好的解决方案,因为听起来他们正在处理一个相当简单的 secnario。然而,“绝对不需要”的说法具有误导性。 MeasureString 是程序员构建自定义表单和控件可用的最佳工具之一。 Web 程序员(通过 HTTP 处理程序)根据可变文本创建精确大小的图像也很方便。 @Tim - 我并不是说 MeasureString 有任何负面影响,它有它的用途,但这显然不是其中之一。用不必要的任意(宽度 += 3)代码混淆您的代码是一种不好的做法。【参考方案2】:

最好的办法是按照ach's answer 的描述设置AutoSize 属性

但是,如果 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";
   

【讨论】:

您不需要添加填充吗? this.button1.Width = (int)size.Width + button1.Padding.Left + button1.Padding.Right;。如果文本的右侧或左侧有图像,则必须添加图像宽度。 @OlivierJacot-Descombes 基于revision history 我也这么认为,然后改变了我的答案。由于有一个更好的答案(安德鲁的),任何使用这个答案的人都很容易确定您是否需要考虑尺寸的填充,我将拒绝修改这个答案。【参考方案3】:

试试这个:

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

【讨论】:

【参考方案4】:

要使 WinForms 中的按钮根据文本的大小增大和/或缩小,您需要将按钮的AutoSize 属性设置为True,并将AutoSizeMode 属性设置为GrowAndShrink

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

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

请注意,如果AutoSizeMode 属性设置为GrowOnlyAutoSize 属性将只允许按钮的大小增加;通过将AutoSizeMode 属性更改为GrowAndShrink,按钮现在将根据其Text 属性自动扩展或缩小宽度和高度。

另请注意,在设置如上所示的两个属性时,您可以在 Text 属性中使用新行(Environment.NewLinevbCrLf),按钮将根据需要缩小。

【讨论】:

【参考方案5】:

正如Andrew Hanlon 解释的那样,您可以设置AutoSize = true

这样做时,您还可以通过将按钮放在FlowLayoutPanel 上自动获得完美的按钮布局。

FlowLayoutPanelFlowDirectionLeftToRightRightToLeft 时,它们之间的水平距离将始终保持不变。您可以通过适当设置按钮的Margin 属性来调整此距离。您可以通过增加按钮的左边距来创建按钮组以开始新组。

如果将按钮的Dock 属性设置为DockStyle.Fill,如果FlowLayoutPanelFlowDirectionTopDown 或@,它们甚至会自动增加宽度以适应最宽的按钮987654334@.

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

【讨论】:

【参考方案6】:

除了按照其他答案中的建议将AutoSize 设置为trueAutoSizeMode 设置为GrowAndShrink 之外,如果您设置了按钮,您可能还需要设置TextImageRelation 属性图像,以便文本不会与图像重叠。

【讨论】:

以上是关于如何根据其文本调整按钮的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何调整滚动视图内容的大小并根据其文本大小将文本视图放入其中? [复制]

如何根据文本长度或背景图像调整按钮宽度

如何根据文本的长度自动调整固定 DIV 中的文本大小?

自动布局根据文本调整按钮大小并让文本字段填充可用空间

如何根据内容调整 UITextView 的大小?

Swift 3 Button 文本自动调整大小