Lettertypen verpakken met toepassingen

In dit onderwerp vindt u een overzicht van het verpakken van lettertypen met uw WPF-toepassing (Windows Presentation Foundation).

Opmerking

Net als bij de meeste typen software worden lettertypebestanden gelicentieerd in plaats van verkocht. Licenties die van toepassing zijn op het gebruik van lettertypen verschillen van leverancier tot leverancier, maar in het algemeen geldt dat de meeste licenties, waaronder de lettertypen die Microsoft levert met toepassingen en Windows, niet toestaan dat de lettertypen worden ingesloten in toepassingen of anderszins opnieuw worden gedistribueerd. Daarom is het als ontwikkelaar uw verantwoordelijkheid om ervoor te zorgen dat u over de vereiste licentierechten beschikt voor elk lettertype dat u insluit in een toepassing of anderszins herdistribueert.

Inleiding tot het verpakken van lettertypen

U kunt lettertypen eenvoudig inpakken als resources in uw WPF-toepassingen om tekst van de gebruikersinterface en andere typen op tekst gebaseerde inhoud weer te geven. De lettertypen kunnen worden gescheiden van of ingesloten in de assemblybestanden van de toepassing. U kunt ook een lettertypebibliotheek met alleen resources maken waarnaar uw toepassing kan verwijzen.

OpenType- en TrueType-lettertypen® bevatten een typevlag, fsType, waarmee licentierechten voor het insluiten van lettertypen voor het lettertype worden aangegeven. Deze typevlag verwijst echter alleen naar ingesloten lettertypen die zijn opgeslagen in een document. Deze vlag verwijst niet naar lettertypen die zijn ingesloten in een toepassing. U kunt de rechten voor het insluiten van lettertypen voor een lettertype ophalen door een GlyphTypeface object te maken en te verwijzen naar de eigenschap EmbeddingRights. Raadpleeg de sectie OS/2 en Windows Metrics van de OpenType Specification voor meer informatie over de fsType-vlag.

De Microsoft Typografie website bevat contactgegevens waarmee u een bepaalde leverancier van lettertypen kunt vinden of een lettertypeleverancier kunt vinden voor aangepast werk.

Lettertypen toevoegen als inhoudsitems

U kunt lettertypen toevoegen aan uw toepassing als projectinhoudsitems die los staan van de assemblybestanden van de toepassing. Dit betekent dat inhoudsitems niet worden ingesloten als resources binnen een assembly. In het volgende voorbeeld van een projectbestand ziet u hoe u inhoudsitems definieert.

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

Om ervoor te zorgen dat de toepassing de lettertypen tijdens runtime kan gebruiken, moeten de lettertypen toegankelijk zijn in de implementatiemap van de toepassing. Met het <CopyToOutputDirectory>-element in het projectbestand van de toepassing kunt u de lettertypen automatisch naar de implementatiemap van de toepassing kopiëren tijdens het buildproces. In het volgende voorbeeld van een projectbestand ziet u hoe u lettertypen kopieert naar de implementatiemap.

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

In het volgende codevoorbeeld ziet u hoe u naar het lettertype van de toepassing kunt verwijzen als een inhoudsitem. Het inhoudsitem waarnaar wordt verwezen, moet zich in dezelfde map bevinden als de assemblybestanden van de toepassing.

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

Lettertypen toevoegen als resource-elementen

U kunt lettertypen toevoegen aan uw toepassing als projectresource-items die zijn ingesloten in de assemblybestanden van de toepassing. Door een afzonderlijke submap voor resources te gebruiken, kunt u de projectbestanden van de toepassing ordenen. In het volgende voorbeeld van een projectbestand ziet u hoe u lettertypen definieert als resource-items in een afzonderlijke submap.

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

Opmerking

Wanneer u lettertypen als resources aan uw toepassing toevoegt, moet u ervoor zorgen dat u het <Resource> element instelt en niet het <EmbeddedResource> element in het projectbestand van uw toepassing. Het <EmbeddedResource>-element voor de build-actie wordt niet ondersteund.

In het volgende voorbeeld van markeringen ziet u hoe u naar de lettertypebronnen van de toepassing verwijst.

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

Verwijzing naar bronitems voor lettertypen uit code

Als u wilt verwijzen naar lettertyperesource-items uit code, moet u een verwijzing naar tweedelige lettertyperesources opgeven: de basis-URI (Uniform Resource Identifier); en de verwijzing naar de locatie van het lettertype. Deze waarden worden gebruikt als de parameters voor de methode FontFamily. In het volgende codevoorbeeld ziet u hoe u verwijst naar de lettertypebronnen van de toepassing in de submap van het project met de naam 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")

De URI (Base Uniform Resource Identifier) kan de submap van de toepassing bevatten waarin de lettertyperesource zich bevindt. In dit geval hoeft de verwijzing naar de lettertypelocatie geen map op te geven, maar moet deze beginnen met './', wat aangeeft dat de lettertyperesource zich in dezelfde map bevindt als die welke is opgegeven door de basis-URI (Uniform Resource Identifier). In het volgende codevoorbeeld ziet u een alternatieve manier om te verwijzen naar het lettertyperesource-item. Dit is gelijk aan het vorige codevoorbeeld.

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

Verwijzingen naar lettertypen uit de submap van dezelfde toepassing

U kunt zowel toepassingsinhoud als resourcebestanden in dezelfde door de gebruiker gedefinieerde submap van uw toepassingsproject plaatsen. In het volgende voorbeeld van een projectbestand ziet u een inhoudspagina en lettertypebronnen die zijn gedefinieerd in dezelfde submap.

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

Omdat de inhoud en het lettertype van de toepassing zich in dezelfde submap bevinden, is de lettertypereferentie relatief ten opzichte van de inhoud van de toepassing. In de volgende voorbeelden ziet u hoe u naar de lettertyperesource van de toepassing verwijst wanneer het lettertype zich in dezelfde map bevindt als de toepassing.

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

Lettertypen in een toepassing opsommen

Als u lettertypen wilt opsommen als resource-items in uw toepassing, gebruikt u de methode GetFontFamilies of GetTypefaces. In het volgende voorbeeld ziet u hoe u de methode GetFontFamilies gebruikt om de verzameling FontFamily objecten op te halen uit de locatie van het lettertype van de toepassing. In dit geval bevat de toepassing een submap met de naam '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

In het volgende voorbeeld ziet u hoe u de methode GetTypefaces gebruikt om de verzameling Typeface objecten op te halen uit de locatie van het lettertype van de toepassing. In dit geval bevat de toepassing een submap met de naam '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

Een bibliotheek voor lettertyperesources maken

U kunt een bibliotheek met alleen resources maken die alleen lettertypen bevat. Er maakt geen code deel uit van dit type bibliotheekproject. Het maken van een bibliotheek met alleen resources is een veelgebruikte techniek voor het loskoppelen van resources uit de toepassingscode die deze gebruikt. Hierdoor kan de bibliotheekassembly ook worden opgenomen in meerdere toepassingsprojecten. In het volgende projectbestandsvoorbeeld ziet u de belangrijkste gedeelten van een bibliotheekproject met alleen resources.

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

Verwijzen naar een lettertype in een resourcebibliotheek

Als u vanuit uw toepassing naar een lettertype in een resourcebibliotheek wilt verwijzen, moet u de lettertypeverwijzing voorafgaan met de naam van de bibliotheekassembly. In dit geval is de verzameling van de lettertyperesource 'FontLibrary'. Als u de assemblynaam wilt scheiden van de verwijzing in de assembly, gebruikt u een ';'-teken. Als u het trefwoord Component toevoegt, gevolgd door de verwijzing naar de lettertypenaam, wordt de volledige verwijzing naar de bron van de lettertypebibliotheek voltooid. In het volgende codevoorbeeld ziet u hoe u naar een lettertype in een resourcebibliotheek-assembly verwijst.

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

Beperkingen voor lettertypegebruik

In de volgende lijst worden verschillende beperkingen beschreven voor het verpakken en gebruiken van lettertypen in WPF-toepassingen:

  • Machtigingsbits voor het insluiten van lettertypen: WPF-toepassingen controleren noch afdwingen enige machtigingsbits voor het insluiten van lettertypen. Zie de sectie Inleiding tot het verpakken van lettertypen voor meer informatie.

  • Lettertypen van de oorspronkelijke site: WPF-toepassingen (Windows Presentation Foundation) staan geen verwijzingen naar lettertypen toe via een HTTP- of FTP-URI (Uniform Resource Identifier).

  • Absolute URI met de pack:-notatie: WPF-toepassingen staan niet toe dat u een FontFamily object via programmacode maakt met 'pack:' als onderdeel van de absolute URI-verwijzing (Uniform Resource Identifier) naar een lettertype. "pack://application:,,,/resources/#Pericles Light" is bijvoorbeeld een ongeldige lettertypereferentie.

  • Automatisch insluiten van lettertypen: Tijdens de ontwerptijd is er geen ondersteuning voor het zoeken naar lettertypen van een toepassing en het automatisch insluiten van de lettertypen in de resources van de toepassing.

  • Subsets lettertype: WPF-toepassingen ondersteunen het maken van subsets lettertype niet voor niet-vaste documenten.

  • In gevallen waarin er een onjuiste verwijzing is, valt de toepassing terug op het gebruik van een beschikbaar lettertype.

Zie ook