Dela via


Paketera teckensnitt med program

Det här avsnittet innehåller en översikt över hur du paketera teckensnitt med ditt WPF-program (Windows Presentation Foundation).

Anmärkning

Precis som med de flesta typer av programvara licensieras teckensnittsfiler i stället för att säljas. Licenser som styr användningen av teckensnitt varierar från leverantör till leverantör, men i allmänhet tillåter de flesta licenser, inklusive de som täcker teckensnitt som Microsoft tillhandahåller med program och Windows, inte att teckensnitten bäddas in i program eller på annat sätt omfördelas. Som utvecklare är det därför ditt ansvar att se till att du har de licensrättigheter som krävs för alla teckensnitt som du bäddar in i ett program eller på annat sätt omdistribuerar.

Introduktion till paketeringsteckensnitt

Du kan enkelt paketera teckensnitt som resurser i dina WPF-program för att visa användargränssnittstext och andra typer av textbaserat innehåll. Teckensnitten kan vara separata från eller inbäddade i programmets sammansättningsfiler. Du kan också skapa ett teckensnittsbibliotek med endast resurser, som programmet kan referera till.

OpenType- och TrueType®-teckensnitt innehåller en typflagga, fsType, som anger teckensnittets rättigheter för inbäddning. Den här typflaggan refererar dock bara till inbäddade teckensnitt som lagras i ett dokument. Den refererar inte till teckensnitt som är inbäddade i ett program. Du kan hämta inbäddningsrättigheterna för teckensnitt genom att skapa ett GlyphTypeface objekt och referera till dess EmbeddingRights egenskap. Mer information om fsType-flaggan finns i avsnittet OS/2 och Windows Metrics i OpenType Specification.

Webbplatsen Microsoft Typography innehåller kontaktinformation som kan hjälpa dig att hitta en viss teckensnittsleverantör eller hitta en teckensnittsleverantör för anpassat arbete.

Lägga till teckensnitt som innehållsobjekt

Du kan lägga till teckensnitt i programmet som projektinnehållsobjekt som är separata från programmets sammansättningsfiler. Det innebär att innehållsobjekt inte är inbäddade som resurser i en sammansättning. Följande projektfilexempel visar hur du definierar innehållsobjekt.

<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>

För att säkerställa att programmet kan använda teckensnitten vid körning måste teckensnitten vara tillgängliga i programmets distributionskatalog. Med elementet <CopyToOutputDirectory> i programmets projektfil kan du automatiskt kopiera teckensnitten till programdistributionskatalogen under byggprocessen. Följande projektfilexempel visar hur du kopierar teckensnitt till distributionskatalogen.

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

Följande kodexempel visar hur du refererar till programmets teckensnitt som ett innehållsobjekt – det refererade innehållsobjektet måste finnas i samma katalog som programmets sammansättningsfiler.

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

Lägga till teckensnitt som resursobjekt

Du kan lägga till teckensnitt i programmet som projektresursobjekt som är inbäddade i programmets sammansättningsfiler. Genom att använda en separat underkatalog för resurser kan du organisera programmets projektfiler. Följande projektfilexempel visar hur du definierar teckensnitt som resursobjekt i en separat underkatalog.

<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>

Anmärkning

När du lägger till teckensnitt som resurser i ditt program kontrollerar du att du ställer in elementet <Resource> och inte det <EmbeddedResource> elementet i programmets projektfil. <EmbeddedResource>-elementet för byggåtgärden stöds inte.

Följande markeringsexempel visar hur du refererar till programmets teckensnittsresurser.

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

Referera till teckensnittsresursobjekt från kod

För att kunna referera till teckensnittsresursobjekt från kod måste du ange en resursreferens i två delar: den grundläggande enhetliga resursidentifieraren (URI); och referensen för teckensnittsplats. Dessa värden används som parametrar för metoden FontFamily. Följande kodexempel visar hur du refererar till programmets teckensnittsresurser i projektunderkatalogen med namnet 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 :n (Base Uniform Resource Identifier) kan innehålla underkatalogen för programmet där teckensnittsresursen finns. I det här fallet behöver teckensnittsplatsreferensen inte ange en katalog, men måste innehålla en inledande "./", som anger att teckensnittsresursen finns i samma katalog som anges av URI :n (Base Uniform Resource Identifier). I följande kodexempel visas ett alternativt sätt att referera till teckensnittsresursobjektet – det motsvarar föregående kodexempel.

// 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")

Referera till teckensnitt från underkatalogen för samma program

Du kan placera både programinnehåll och resursfiler i samma användardefinierade underkatalog för ditt programprojekt. I följande projektfilexempel visas en innehållssida och teckensnittsresurser som definierats i samma underkatalog.

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

Eftersom programinnehållet och teckensnittet finns i samma underkatalog är teckensnittsreferensen relativ till programinnehållet. I följande exempel visas hur du refererar till programmets teckensnittsresurs när teckensnittet finns i samma katalog som programmet.

<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")

Räkna upp teckensnitt i ett program

Om du vill räkna upp teckensnitt som resursobjekt i ditt program använder du antingen metoden GetFontFamilies eller GetTypefaces. I följande exempel visas hur du använder metoden GetFontFamilies för att returnera samlingen med FontFamily objekt från programmets teckensnittsplats. I det här fallet innehåller programmet en underkatalog med namnet "resurser".

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

I följande exempel visas hur du använder metoden GetTypefaces för att returnera samlingen med Typeface objekt från programmets teckensnittsplats. I det här fallet innehåller programmet en underkatalog med namnet "resurser".

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

Skapa ett teckensnittsresursbibliotek

Du kan skapa ett bibliotek med endast resurser som endast innehåller teckensnitt– ingen kod ingår i den här typen av biblioteksprojekt. Att skapa ett bibliotek med endast resurser är en vanlig teknik för att avkoda resurser från programkoden som använder dem. Detta gör också att bibliotekssammansättningen kan ingå i flera programprojekt. I följande projektfilexempel visas nyckeldelarna i ett biblioteksprojekt med endast resurser.

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

Referera till ett teckensnitt i ett resursbibliotek

Om du vill referera till ett teckensnitt i ett resursbibliotek från ditt program måste du prefixa teckensnittsreferensen med namnet på bibliotekssammansättningen. I det här fallet är teckensnittsresurssammansättningen "FontLibrary". Om du vill separera sammansättningsnamnet från referensen i sammansättningen använder du ett ';'-tecken. Om du lägger till nyckelordet "Komponent" följt av referensen till teckensnittsnamnet slutförs den fullständiga referensen till teckensnittsbibliotekets resurs. I följande kodexempel visas hur du refererar till ett teckensnitt i en resursbibliotekssammansättning.

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

Anmärkning

Denna SDK innehåller en uppsättning OpenType-exempelteckensnitt som du kan använda med WPF-program. Teckensnitten definieras i ett bibliotek med endast resurser. Mer information finns i Exempel på OpenType-teckensnittspaket.

Begränsningar för teckensnittsanvändning

I följande lista beskrivs flera begränsningar för paketering och användning av teckensnitt i WPF-program:

  • Inbäddningsbehörighetsbitar för teckensnitt: WPF-program kontrollerar eller upprätthåller inte några inbäddningsbehörighetsbitar för teckensnitt. Mer information finns i avsnittet Introduction_to_Packing Fonts.

  • plats för ursprungsteckensnitt: WPF-program tillåter inte en teckensnittsreferens till en http- eller ftp-URI (Uniform Resource Identifier).

  • Absolut URI med hjälp av pack: notation: WPF-program tillåter inte att du skapar ett FontFamily-objekt programmatiskt med hjälp av "pack:" som en del av URI-referensen (absolut uniform resource identifier) till ett teckensnitt. Till exempel är "pack://application:,,,/resources/#Pericles Light" en ogiltig teckensnittsreferens.

  • Automatisk inbäddning av teckensnitt: Under designtiden finns det inget stöd för att söka i ett programs användning av teckensnitt och automatiskt bädda in teckensnitten i programmets resurser.

  • teckensnittsunderuppsättningar: WPF-program stöder inte skapandet av teckensnittsunderuppsättningar för icke-fasta dokument.

  • I fall där det finns en felaktig referens återgår programmet till att använda ett tillgängligt teckensnitt.

Se även