將字型與應用程式一起封裝

本主題提供如何使用 Windows Presentation Foundation (WPF) 應用程式封裝字型的概觀。

注意

與大部分類型的軟體一樣,字型檔是經由授權而非販售的。 管理字型使用方式的授權會因廠商而異,但一般而言,大部分授權,包括涵蓋 Microsoft 提供的應用程式和 Windows 字型的授權,不允許字型內嵌在應用程式內,否則會轉散發。 因此,身為開發人員,您的職責是確保對於您內嵌在應用程式中或是以其他方式轉散發的任何字型,您必須有必要的授權權限。

封裝字型簡介

您可以輕鬆地將字型封裝為 WPF 應用程式內的資源,以顯示使用者介面文字和其他類型的文字型內容。 字型可以從應用程式的組件檔中分離出來或內嵌於其中。 您也可以建立僅含資源的字型庫,以供應用程式參考。

OpenType 和 TrueType® 字型包含類型旗標 fsType,表示字型的字型內嵌授權許可權。 不過,此類型旗標只會參考儲存於文件中的內嵌字型,而不會參考內嵌於應用程式中的字型。 您可以藉由建立 GlyphTypeface 物件並參考其 EmbeddingRights 屬性,擷取字型的字型內嵌許可權。 如需 fsType 旗標的詳細資訊,請參閱 OpenType 規格 (英文)的<OS/2 和 Windows 計量>一節。

Microsoft 排版 (英文) 網站所含的連絡資訊,可協助您找出特定字型供應商,或尋找自訂工作所需字型的供應商。

將字型新增為內容項目

您可以將字型新增到您的應用程式,以做為與應用程式組件檔分開的專案內容項目。 這表示內容項目不會內嵌為組件中的資源。 下列專案檔範例示範如何定義內容項目。

<Project DefaultTargets="Build"  
                xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
  <!-- Other project build settings ... -->  
  
  <ItemGroup>  
    <Content Include="Peric.ttf" />  
    <Content Include="Pericl.ttf" />  
  </ItemGroup>  
</Project>  

為了確保應用程式可以在執行階段使用字型,必須可在應用程式的部署目錄中存取字型。 <CopyToOutputDirectory>應用程式專案檔中的 專案可讓您在建置程式期間自動將字型複製到應用程式部署目錄。 下列專案檔範例示範如何將字型複製到部署目錄。

<ItemGroup>  
  <Content Include="Peric.ttf">  
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>  
  </Content>  
  <Content Include="Pericl.ttf">  
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>  
  </Content>  
</ItemGroup>  

下列程式碼範例示範如何參考應用程式的字型以做為內容項目 - 參考的內容項目必須與應用程式的組件檔位於相同的目錄。

<TextBlock FontFamily="./#Pericles Light">
  Aegean Sea
</TextBlock>

將字型新增為資源項目

您可以將字型新增到您的應用程式,以做為內嵌於您應用程式組件檔中的專案資源項目。 針對資源使用不同的子目錄,可協助組織應用程式的專案檔。 下列專案檔範例示範如何將字型定義為個別子目錄中的資源項目。

<Project DefaultTargets="Build"  
                xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
  <!-- Other project build settings ... -->  
  
  <ItemGroup>  
    <Resource Include="resources\Peric.ttf" />  
    <Resource Include="resources\Pericl.ttf" />  
  </ItemGroup>  
</Project>  

注意

當您將字型新增為應用程式的資源時,請確定您正在設定 <Resource> 專案,而不是 <EmbeddedResource> 應用程式專案檔中的 專案。 <EmbeddedResource>不支援建置動作的專案。

下列標記範例示範如何參考應用程式的字型資源。

<TextBlock FontFamily="./resources/#Pericles Light">
  Aegean Sea
</TextBlock>

從程式碼參考字型資源項目

若要從程式碼參考字型資源專案,您必須提供兩部分字型資源參考:基底統一資源識別項(URI):和字型位置參考。 這些值會當做 方法的參數 FontFamily 使用。 下列程式碼範例示範如何在名為 resources 的專案子目錄中,參考應用程式的字型資源。

// The font resource reference includes the base URI reference (application directory level),
// and a relative URI reference.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./resources/#Pericles Light");
' The font resource reference includes the base URI reference (application directory level),
' and a relative URI reference.
myTextBlock.FontFamily = New FontFamily(New Uri("pack://application:,,,/"), "./resources/#Pericles Light")

基底統一資源識別項 (URI) 可以包含字型資源所在的應用程式子目錄。 在此情況下,字型位置參考不需要指定目錄,但必須包含前置 「 ./ 」,這表示字型資源位於基底統一資源識別項 (URI) 所指定的相同目錄中。 下列程式碼範例示範參考字型資源項目的替代方法 - 它相當於上述程式碼範例。

// The base URI reference can include an application subdirectory.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/resources/"), "./#Pericles Light");
' The base URI reference can include an application subdirectory.
myTextBlock.FontFamily = New FontFamily(New Uri("pack://application:,,,/resources/"), "./#Pericles Light")

從相同的應用程式子目錄參考字型

您可以將應用程式內容與資源檔置於應用程式專案的同一個使用者定義的子目錄內。 下列專案檔範例示範內容頁面和字型資源定義於相同的子目錄中。

<ItemGroup>  
  <Page Include="pages\HomePage.xaml" />  
</ItemGroup>  
<ItemGroup>  
  <Resource Include="pages\Peric.ttf" />  
  <Resource Include="pages\Pericl.ttf" />  
</ItemGroup>  

由於應用程式內容和字型位於相同的子目錄,因此,字型參考會相對於應用程式內容。 下列範例示範當字型與應用程式位於相同目錄時,如何參考應用程式的字型資源。

<TextBlock FontFamily="./#Pericles Light">
  Aegean Sea
</TextBlock>
// The font resource reference includes the base Uri (application directory level),
// and the file resource location, which is relative to the base Uri.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "/pages/#Pericles Light");
' The font resource reference includes the base Uri (application directory level),
' and the file resource location, which is relative to the base Uri.
myTextBlock.FontFamily = New FontFamily(New Uri("pack://application:,,,/"), "/pages/#Pericles Light")

列舉應用程式中的字型

若要列舉字型做為應用程式中的資源專案,請使用 GetFontFamiliesGetTypefaces 方法。 下列範例示範如何使用 GetFontFamilies 方法,從應用程式字型位置傳回 物件的集合 FontFamily 。 在此案例中,應用程式包含名為 "resources"的子目錄。

foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/"))
{
    // Perform action.
}
For Each fontFamily As FontFamily In Fonts.GetFontFamilies(New Uri("pack://application:,,,/"), "./resources/")
    ' Perform action.
Next fontFamily

下列範例示範如何使用 GetTypefaces 方法,從應用程式字型位置傳回 物件的集合 Typeface 。 在此案例中,應用程式包含名為 "resources"的子目錄。

foreach (Typeface typeface in Fonts.GetTypefaces(new Uri("pack://application:,,,/"), "./resources/"))
{
    // Perform action.
}
For Each typeface As Typeface In Fonts.GetTypefaces(New Uri("pack://application:,,,/"), "./resources/")
    ' Perform action.
Next typeface

建立字型資源程式庫

您可以建立僅含資源的程式庫 (其中僅包含字型) - 這種類型的程式庫專案不會包含任何程式碼。 建立僅含資源的程式庫是從使用資源的應用程式程式碼中減少資源的常見技術。 這也可讓程式庫組件包含於多個應用程式專案中。 下列專案檔範例顯示僅含資源的程式庫專案的主要部分。

<PropertyGroup>  
  <AssemblyName>FontLibrary</AssemblyName>  
  <OutputType>library</OutputType>  
  ...  
</PropertyGroup>  
...
<ItemGroup>  
  <Resource Include="Kooten.ttf" />  
  <Resource Include="Pesca.ttf" />  
</ItemGroup  

參考資源程式庫中的字型

若要從您的應用程式參考資源程式庫中的字型,您必須在程式庫組件名稱前面加上字型參考。 在此案例中,字型資源組件是 "FontLibrary"。 若要將組件內的組件名稱與參考分隔開來,請使用 ';' 字元。 加入 "Component" 關鍵字,後面緊接著對字型名稱的參考,即可完成對字型程式庫資源的完整參考。 下列程式碼範例示範如何參考資源程式庫組件中的字型。

<Run FontFamily="/FontLibrary;Component/#Kootenay" FontSize="36">
  ABCDEFGHIJKLMNOPQRSTUVWXYZ
</Run>

注意

此 SDK 包含一組範例 OpenType 字型,您可以搭配 WPF 應用程式使用。 字型定義於僅含資源的程式庫中。 如需詳細資訊,請參閱 範例 OpenType 字型套件

字型使用限制

下列清單描述 WPF 應用程式中封裝和使用字型的數個限制:

  • 字型內嵌許可權位: WPF 應用程式不會檢查或強制執行任何字型內嵌許可權位。 如需詳細資訊,請參閱 封裝字型簡介一節。

  • 來源字型網站: WPF 應用程式不允許 HTTP 或 ftp 統一資源識別項的字型參考(URI)。

  • 使用套件的絕對 URI:標記法: WPF 應用程式不允許您以程式設計方式使用 「pack:」 來建立物件,做為字型絕對統一 FontFamily 資源識別碼 (URI) 參考的一部分。 例如, "pack://application:,,,/resources/#Pericles Light" 是不正確字型參考。

  • 自動字型內嵌︰在設計階段期間,不支援搜尋應用程式所使用的字型,也不支援自動將字型內嵌於應用程式的資源中。

  • 字型子集: WPF 應用程式不支援為非固定檔建立字型子集。

  • 萬一其中含有不正確的參考,應用程式就會回復以使用可用字型。

另請參閱