2011-11-22 196 views
1

我在winform應用程序中有一個自定義標籤。我跨線程更改標籤的內容。 我打開一個後臺線程讀取輸入數據,我打電話給我的跨線程方法使用下面的代碼更改標籤內容:C#Windows窗體標籤字體問題

// ... invoke a cross-thread method to reset progress label information 
Set_ProgressInfo("Reading data from input data file ... inputData"); 

我的跨線程的方法是:

public void Set_ProgressInfo(string text) 
{ 
    if (this.progressInfo.InvokeRequired) 
    { 
     this.progressInfo.BeginInvoke(new MethodInvoker(delegate() 
      { Set_ProgressInfo(text); })); 
    } 
    else 
    { 
     this.progressInfo.Text = text; 

     this.progressInfo.Location = new System.Drawing.Point(55, 595); 
     this.progressInfo.ForeColor = System.Drawing.Color.AliceBlue; 
     this.progressInfo.Font = new System.Drawing.Font("Verdana", 10.0f, 
      System.Drawing.FontStyle.Bold); 

     // Auto size label to fit the text 
     // ... create a Graphics object for the label 
     using (var g_progressInfo = this.progressInfo.CreateGraphics()) 
     { 
      // ... get the Size needed to accommodate the formatted text 
      Size preferredSize_progressInfo = g_progressInfo.MeasureString(
      this.progressInfo.Text, this.progressInfo.Font).ToSize(); 

      // ... pad the text and resize the label 
      this.progressInfo.ClientSize = new Size(
      preferredSize_progressInfo.Width + (BSAGlobals.labelTextPadding), 
      preferredSize_progressInfo.Height + (BSAGlobals.labelTextPadding)); 
     } 
    } 
} 

一切都很正常,因爲它應該,除了:

當我改變

this.progressInfo.Font = new System.Drawing.Font("Verdana", 10.0f, 
    System.Drawing.FontStyle.Bold); 
字號

從10.0f到8.0f,只有「讀取從輸入數據文件的數據...」的串的部分中調用組件

Set_ProgressInfo("Reading data from input data file ... inputData"); 

顯示器。出於某種原因,尺寸不能在較小的字體尺寸下正確計算。我在這裏錯過了什麼嗎?我一直在爲此掙扎一段時間,根本看不出原因。任何幫助將不勝感激。謝謝。

+0

你沒有提到它,但AutoSize = false?你是否在設計師或代碼中更改字體大小? – LarsTech

+0

我正在更改代碼中的大小,我沒有在任何地方設置AutoSize。我正在以編程方式做所有事情。 – Zeos6

回答

2

您使用了錯誤的測量方法,使用TextRenderer.MeasureText()代替。 .NET 1.x渲染方法(Graphics.DrawString)的字體指標不一樣。從技術上講,你應該使用兩者,使用標籤的UseCompatibleTextRendering屬性的值,但可以輕鬆地跳過。

不喜歡使用標籤的Padding和AutoSize屬性,因此這是全部自動的。

+1

沒想到這個。我會嘗試並報告回來。當你說「技術上你應該同時使用......」時,不確定你指的是什麼。謝謝。 – Zeos6

+0

我沒有使用MeasureText(),因爲它不是很準確,但是彈出我使用SetMeasurableCharacterRanges()重新編碼的建議。它會產生同樣的問題。出於某種原因,字符串文字在...之後停止,但使用System.Diagnostics.Debug.WriteLine(文本)顯示正確的文本。 – Zeos6

1

您是否在更改字體大小後嘗試使控件失效?可以做的伎倆..

http://msdn.microsoft.com/en-us/library/598t492a.aspx

+0

字體在運行時未被更改。我想保持字體大小不變。我重新編譯新的大小,它發生。所以這個解決方案不適用。但是,謝謝。 – Zeos6