將字型與應用程式一起封裝
本主題提供如何使用 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")
列舉應用程式中的字型
若要將字型列舉為應用程式中的資源項目,請使用 GetFontFamilies 或 GetTypefaces 方法。 下列範例示範如何使用 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
下列範例示範如何使用 GetFontFamilies 方法,將 FontFamily 物件的集合從應用程式字型位置傳回。 在此案例中,應用程式包含名為 "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:" 作為對字型之絕對統一資源識別項 (URI) 參考的一部分來建立 FontFamily 物件。 例如,
"pack://application:,,,/resources/#Pericles Light"
是無效的字型參考。自動字型內嵌︰在設計階段期間,不支援搜尋應用程式所使用的字型,也不支援自動將字型內嵌於應用程式的資源中。
字型子集︰WPF 應用程式不支援為非固定文件建立字型子集。
萬一其中含有不正確的參考,應用程式就會回復以使用可用字型。