[英]C#: A function that will auto adjust fonts base on the control size at runtime?
花了很多時間搜索此功能后:
我認為如果有人能給我最好的方法,這將是很好的。 是否有一個功能可以根據任何窗體控件(標簽/按鈕)的大小動態調整字體大小?
這是我在網上研究后的情況,不幸的是,這些代碼在控件重新調整大小的運行時會產生很多異常。
public void textAdjustment()
{
try
{
while (this.label.Width < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text,
new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width)
{
this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 1.0f, this.label.Font.Style);
}
if (this.label.Width > System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width)
{
this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size + 0.1f, this.tableLabel.Font.Style);
}
if (this.label.Height < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Height)
{
this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 0.6f, this.label.Font.Style);
}
}
catch (Exception e)
{
this.label.Font = Control.DefaultFont;
}
}
我不認為我的處理方式是正確的,有人知道一種方法,即使在運行時增加和減少控制大小時也會調整字體大小嗎? 我個人認為這篇文章對於其他人來說也是一個非常好的帖子。
這是一種非常麻煩的代碼,字體的正確大小與控件的大小沒有很好的相關性。 這也不是常見的事情,UI在任何窗口大小都應該是可讀的和一致的。 否則你很清楚你所看到的是什么樣的例外。 明顯的錯誤是忘記關閉標簽的AutoSize屬性而不是使標簽足夠高。 有些代碼可以使用,請注意它只適用於Label。 在粘貼此代碼之前在表單上刪除一個:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
label1.AutoSize = false;
label1.Size = new Size(100, 60);
label1.Text = "Autosize this";
label1.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label1.Resize += new EventHandler(label1_Resize);
}
void label1_Resize(object sender, EventArgs e) {
using (var gr = label1.CreateGraphics()) {
Font font = label1.Font;
for (int size = (int)(label1.Height * 72 / gr.DpiY); size >= 8; --size) {
font = new Font(label1.Font.FontFamily, size, label1.Font.Style);
if (TextRenderer.MeasureText(label1.Text, font).Width <= label1.ClientSize.Width) break;
}
label1.Font = font;
}
}
protected override void OnLoad(EventArgs e) {
label1_Resize(this, EventArgs.Empty);
base.OnLoad(e);
}
}
它需要改進,MeasureText()方法應該使用Label控件使用的TextFormatFlags。 但是這個發布得很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.