2011-04-21 48 views
3

我正在使用VS C#2008 Express。C#WinForms FontDialog無法用一些字體初始化?

我添加了使用標準FontDialog控件將用戶的字體選擇存儲和檢索到我的應用程序的功能。

在我的測試過程中,我注意到某些字體沒有完全初始化對話框 - 名稱沒有出現在「字體」框中,並且示例是空白的。

這些字體的名稱的一部分出現在對話框的「字體樣式」列表中:「Arial Black」,「Segoe UI Light」,「Segoe UI Semibold」等等(有趣的是, Arial Narrow「按預期工作。)

無論我在代碼中初始化對話框的字體,還是在IDE中將FontDialog控件的屬性設置爲上述其中一個問題字體,我都會看到同樣的問題。

這是很容易通過只創建一個簡單的形式,添加一個按鈕啓動了FontDialog類控件,它的字體屬性設置爲「宋體黑」大小設置爲16

任何方式來解決這個重現?

添加的信息: 此問題在Windows 7 64位系統上顯示。在Vista和XP上,Arial Black和Arial Narrow被列爲單獨的字體,而不僅僅是帶有Black和Narrow樣式的Arial。因此,看起來微軟正在做一些與Win7中的常見字體對話不同的東西。

+0

您可以在這裏看到問題的圖像:[鏈接](http://i.imgur.com/y7cGf。png) – 2011-04-21 19:31:27

+0

我發現在搜索中很少提及這個問題,但是我確實發現了一個提供了一點洞察力(但沒有解決方案)的方法:[link](http://www.vbmonster.com/Uwe/Forum。 aspx/vb/34616/Combining-fonts-in-same-font-family) – 2011-04-22 18:45:35

+0

我用Delphi應用程序重現了這個問題,所以很明顯是Windows 7的常見字體對話框問題。我提交了關於Microsoft Connect的錯誤報告。如果有任何問題,請回到這裏。 – 2011-04-23 19:42:17

回答

3

我可以證實這種行爲,您應該等待,看看有人提供了爲什麼這是正確的確切解釋,如果沒有人提供,請通過Microsoft Connect報告。

下面是如何重現該問題,使用LINQPad並執行以下程序:

void Main() 
{ 
    using (var dlg = new FontDialog()) 
    { 
     dlg.Font = new Font("Arial Black", 16); 
     dlg.Font.Dump("before"); 
     dlg.ShowDialog(); 
     dlg.Font.Dump("between"); 
     dlg.ShowDialog(); 
     dlg.Font.Dump("after"); 
    } 
} 

使用F4添加到System.Drawing中和System.Windows.Forms的引用,並創下按Ctrl +上的字體和FontDialog類添加的使用條款要求

然後觀察:

  1. 宋體黑色沒有選擇在第一時間它顯示
  2. 如果你,第一次時,挑宋體,然後在字體樣式選擇器中選擇「黑色」,單擊「確定」,對話框將返回而不會選擇任何字體。
  3. 字體的三個轉儲(前提是您選擇了Arial,Black,兩次都是16次)之間唯一不同的是,對話後的大小略微偏離(15.75pt對16pt)。另外,OriginalFontName在對話框後保留爲null。然而,字體名稱是相同的,「Arial Black」。

我覺得這是一個錯誤的原因是,如果同一個對話框彈出兩次,第二次顯示第一次拾取值的結果,它應該顯示相同的信息。

+0

謝謝你的確認,Lasse。我也注意到字體大小令人困惑的0.25pt差異。 – 2011-04-22 20:27:56