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

21
在使用C# + Winforms开发应用程序的过程中,我需要根据不同的语言更改按钮文本。
我的问题如下:
假设我想将一个按钮从“Hi all!”翻译成“Bonjour tout le monde”!
显然,如果输入英文文本或法文文本,按钮的大小将不同...我的问题很“简单”,如何在运行时调整按钮的大小,以便文本适合按钮的内容?
到目前为止,我得到了以下代码!
[Hi all!]
[Bonjour]
6个回答

30

完全没有必要像其他帖子所说的那样使用底层的Graphics对象。

如果你将按钮的 AutoSize 属性设置为 true,AutoSizeMode 设置为 GrowAndShrinkAutoEllipsis 设置为 false,它就会自动调整大小以适应文本。

尽管如此,你可能需要进行一些布局调整,才能使这个变化适应你的用户界面。你可以调整按钮的内边距以在文本周围添加空白,你可能还想将按钮放置在 TableLayoutPanel(或类似的控件)中,以防止它们在调整大小时重叠。

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


对于OP的需求来说,这可能是一个更好的解决方案,因为它听起来他们正在处理一个相当简单的场景。然而,“绝对没有必要”的说法是误导性的。MeasureString是程序员构建自定义表单和控件可用的最佳工具之一。对于Web程序员(通过HTTP处理程序),它也很方便,可以基于可变文本创建精确大小的图像。 - Tim M.
3
@Tim- 我并没有对MeasureString说任何负面的话,它有其用途,但这绝对不是其中之一。在您的代码中添加不必要和任意的(width += 3)代码是一个不良的实践。 - Andrew Hanlon

24

你最好的选择是按照ach的回答所描述的设置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;。如果您在文本的左侧或右侧有图像,则需要添加图像的宽度。 - Olivier Jacot-Descombes
根据修订历史记录,我也是这么认为的,然后改变了我的答案。由于有一个更好的答案(Andrew的),而且任何使用这个答案的人都可以轻松确定是否需要在大小中考虑填充,所以我不打算修改这个答案。 - Conrad Frix

9

试试这个:

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

2

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

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

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

请注意,只有当AutoSizeMode属性设置为GrowOnly时,AutoSize属性才允许按钮的大小增长;将AutoSizeMode属性更改为GrowAndShrink后,按钮现在会根据其Text属性自动延伸或缩小宽度和高度。
还需注意,在设置上述两个属性时,您可以在Text属性中使用换行符(Environment.NewLinevbCrLf),按钮将根据需要进行缩放。

1

Andrew Hanlon所解释的,您可以设置AutoSize = true

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

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

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

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

1
除了像其他答案建议的那样将 AutoSize 设置为 true,并将 AutoSizeMode 设置为 GrowAndShrink 之外,如果您设置了按钮图像,则还需要设置 TextImageRelation 属性,以使文本不会重叠在图像上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接