2010-10-19 33 views
14

Trong quá trình dịch ứng dụng bằng C# + Winforms, tôi cần thay đổi văn bản của nút tùy thuộc vào ngôn ngữ.Cách thay đổi kích thước một nút tùy thuộc vào văn bản của nó

Sự cố của tôi như sau:

Giả sử tôi muốn dịch nút từ "Xin chào tất cả!" tới "Bonjour tout le monde"!

Như bạn có thể đoán, kích thước của nút sẽ không giống nhau nếu tôi nhập văn bản tiếng Anh hoặc tiếng Pháp ... Câu hỏi của tôi là "đơn giản", làm cách nào tôi có thể quản lý để thay đổi kích thước nút khi đang di chuyển để văn bản phù hợp với nội dung của nó trong nút?

Cho đến bây giờ tôi đã nhận được một cái gì đó như thế!

[Hi all!]

[Bonjour]

Trả lời

19

Tốt nhất là để thiết lập AutoSize tài sản như mô tả ach's answer

Tuy nhiên nếu AutoSize là không làm việc cho bạn, thay đổi kích thước các nút trong mã là dễ dàng đủ. Bạn chỉ cần thiết lập chiều rộng của nút. Bí quyết là làm cho nó đủ lớn để phù hợp với văn bản của bạn.

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

Cảm ơn bạn rất nhiều! –

+0

Bạn sẽ không phải thêm phần đệm? 'this.button1.Width = (int) size.Width + button1.Padding.Left + button1.Padding.Right;'. Và nếu bạn có một hình ảnh ở bên phải hoặc bên trái của văn bản, thì bạn sẽ phải thêm chiều rộng hình ảnh. –

+0

@ OlivierJacot-Descombes Dựa trên [sửa đổi lịch sử] (http://stackoverflow.com/posts/3965742/revisions) Tôi nghĩ như vậy là tốt và sau đó thay đổi câu trả lời của tôi. Vì có một câu trả lời vượt trội (Andrew's) và sẽ rất dễ dàng cho bất kỳ ai sử dụng câu trả lời này để xác định xem bạn có cần tính đến padding ở kích thước hay không tôi sẽ từ chối sửa đổi câu trả lời này. –

24

Hoàn toàn không cần sử dụng đối tượng bên dưới Graphics như các áp phích khác đã nói.

Nếu bạn thiết lập thuộc tính AutoSize của nút true, AutoSizeMode để GrowAndShrink, và AutoEllipsis false, nó sẽ thay đổi kích thước tự động để phù hợp với văn bản.

Điều đó đang được nói, bạn có thể cần phải thực hiện một số điều chỉnh bố cục để thực hiện thay đổi này phù hợp với giao diện người dùng của bạn. Bạn có thể điều chỉnh phần đệm của nút để thêm khoảng trống xung quanh văn bản và bạn có thể đặt các nút của mình trong một số TableLayoutPanel (hoặc thứ gì đó) để ngăn chúng trùng lặp khi chúng đổi kích thước.

Edit: @mastro chỉ ra rằng: AutoEllipsis chỉ có giá trị khi AutoSizefalse (Như đã giải thích trong the documentation), vì vậy nó có thể được bỏ qua một cách an toàn miễn là ba đặc tính khác được thiết lập một cách chính xác.

+0

Đối với nhu cầu của OP, điều này có thể là một giải pháp tốt hơn nhiều vì có vẻ như họ đang đối phó với một secnario khá đơn giản. Tuy nhiên, tuyên bố "hoàn toàn không cần" là gây hiểu lầm. MeasureString là một trong những công cụ tốt nhất mà một lập trình viên xây dựng các biểu mẫu tùy chỉnh và các điều khiển có sẵn. Nó cũng tiện dụng cho các lập trình viên web (thông qua trình xử lý HTTP) để tạo ra các hình ảnh có kích thước chính xác dựa trên văn bản biến. –

+2

@Tim - Tôi không nói bất cứ điều gì tiêu cực về MeasureString, nó có nó sử dụng, nhưng điều này là rõ ràng không phải một trong số họ. Riddling mã của bạn với mã không cần thiết và tùy ý (width + = 3) là một thực tế xấu. –

8

Hãy thử điều này:

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

Như Andrew Hanlon giải thích, bạn có thể đặt AutoSize = true.

Khi làm như vậy, bạn cũng có thể tự động hoàn thành bố cục các nút bằng cách đặt chúng trên FlowLayoutPanel.

Khoảng cách ngang giữa chúng sẽ luôn giữ nguyên khi FlowDirection của FlowLayoutPanelLeftToRight hoặc RightToLeft. Bạn có thể điều chỉnh khoảng cách này bằng cách đặt thuộc tính Margin của các nút một cách thích hợp. Bạn có thể tạo các nhóm nút bằng cách tăng lề trái của các nút bắt đầu một nhóm mới.

Nếu bạn đặt Dock tài sản của các nút để DockStyle.Fill, họ thậm chí sẽ phát triển chiều rộng của họ tự động để phù hợp với các nút rộng nhất nếu FlowDirection của FlowLayoutPanelTopDown hoặc BottomUp.

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

Để kích hoạt một nút trong WinForms phát triển và/hoặc thu nhỏ tùy thuộc vào kích thước của văn bản, bạn cần phải thiết lập thuộc tính AutoSize của nút để TrueAutoSizeMode tài sản để GrowAndShrink.

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

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

Xin lưu ý rằng AutoSize bất động sản sẽ chỉ cho phép kích thước của nút để phát triển nếu AutoSizeMode tài sản được thiết lập để GrowOnly; bằng cách thay đổi thuộc tính AutoSizeMode thành GrowAndShrink, nút này sẽ tự động mở rộng hoặc giảm chiều rộng và chiều cao dựa trên thuộc tính Text của nó. Cũng lưu ý rằng trong việc thiết lập hai thuộc tính như được hiển thị ở trên, bạn có thể sử dụng các dòng mới (Environment.NewLine hoặc vbCrLf) trong thuộc tính Văn bản và nút sẽ giảm tỷ lệ khi cần.

Các vấn đề liên quan