2010-06-09 101 views
12

是否有正式的方式來分發(部署).NET應用程序的特定字體?在.NET應用程序中嵌入/部署自定義字體

我們有一個(公共領域)「LED字體」,用復古LED儀表面板的外觀打印數字。這是一個標準的True Type或Open Type字體,除了看起來很時髦。

很明顯,要工作,這種字體需要在用戶的機器上。但我們不希望強制用戶「將特殊字體安裝到您的字體文件夾中」。我們希望直接從TTF加載Font對象,或者以編程方式安裝字體,以便它可用。

應用程序如何處理這類事情?例如,我注意到Adobe XYZ在系統上安裝了各種字體,而無需用戶干預。這就是我們想要做的。

編輯:好吧,最好,我們寧願不是直接安裝字體。我們不希望我們漂亮的主題LED字體出現在MS Word中用戶的字體下拉列表中。我們傾向於使用此字體,但將其用途或外觀限制在我們的應用程序中。任何方式來做到這一點?

編輯2:這是一個WinForms .NET 2.0應用程序。

謝謝!

回答

14

我使用自定義字體爲我定製的圖形庫上asp.net網站,但這應該也沒有問題的WinForm上工作。您只需指定字體文件,字體大小和字體樣式,並返回字體類型。

public static LoadedFont LoadFont(FileInfo file, int fontSize, FontStyle fontStyle) 
{ 
    var fontCollection = new PrivateFontCollection(); 
    fontCollection.AddFontFile(file.FullName); 
    if (fontCollection.Families.Length < 0) 
    { 
     throw new InvalidOperationException("No font familiy found when loading font"); 
    } 

    var loadedFont = new LoadedFont(); 
    loadedFont.FontFamily = fontCollection.Families[0]; 
    loadedFont.Font = new Font(loadedFont.FontFamily, fontSize, fontStyle, GraphicsUnit.Pixel); 
    return loadedFont; 
} 

LoadedFont是一個簡單的結構

public struct LoadedFont 
{ 
    public Font Font { get; set; } 
    public FontFamily FontFamily { get; set; } 
} 

這是需要防止的FontFamily被GC'ed和字體不工作(asp.net,我是否需要它不知道WinForm的)。

+0

謝謝,甚至不知道那裏*是* PrivateFontFamily類,應該這樣做 – 2010-06-09 18:01:32

+0

不錯,請評論它是否真的有效:) – Duckie 2010-06-09 18:59:38

+0

它的工作原理。至少用我剛剛試過的測試字體。看來這是這些類的確切目的。 :) – 2010-06-09 19:32:08

3

對於WPF應用程序,您可以將其添加爲資源。

here

你只需要設置生成操作的資源,然後引用它,如下所示:

<TextBlock FontFamily="./Resources/#Custom Font Name">

+0

謝謝。 Upvoted。我希望可以*使用* WPF。不幸的是,這個應用程序是直Winforms。 – 2010-06-09 17:29:52

+0

偉大的提示!但它不適用於我:(我有現在我試圖引用通過添加seguisym.ttf,然後編寫我嘗試了BuildAction:資源,嵌入式資源和內容,但沒有一個能夠工作。本手冊包含的原因是Windows 8有一個更新版本的字體,並且在運行Windows 7的客戶端上還需要多個圖標。 – 2015-01-11 23:30:31