Udostępnij za pośrednictwem


Pakowanie czcionek za pomocą aplikacji

Ten temat zawiera omówienie sposobu tworzenia pakietów czcionek za pomocą aplikacji Windows Presentation Foundation (WPF).

Notatka

Podobnie jak w przypadku większości typów oprogramowania, pliki czcionek są licencjonowane, a nie sprzedawane. Licencje, które zarządzają używaniem czcionek różnią się od dostawcy do dostawcy, ale ogólnie większość licencji, w tym te obejmujące czcionki firmy Microsoft dostarcza z aplikacjami i systemem Windows, nie zezwalają na osadzanie czcionek w aplikacjach lub w inny sposób redystrybucjonowane. W związku z tym jako deweloper ponosisz odpowiedzialność za zapewnienie, że masz wymagane prawa do licencji dla każdej czcionki osadzonej w aplikacji lub w inny sposób rozpowszechniania.

Wprowadzenie do pakietowania czcionek

Możesz łatwo spakować czcionki jako zasoby w aplikacjach WPF, aby wyświetlać tekst interfejsu użytkownika i inne typy zawartości opartej na tekście. Czcionki mogą być odseparowane od plików zestawienia aplikacji lub osadzone w nich. Możesz również utworzyć bibliotekę czcionek zawierającą wyłącznie zasoby, do której może odwoływać się aplikacja.

Czcionki OpenType i TrueType® zawierają typ flagi fsType, która określa prawa do osadzania czcionek związane z licencjonowaniem. Jednak ta flaga typu odnosi się tylko do czcionek osadzonych przechowywanych w dokumencie— nie odnosi się do czcionek osadzonych w aplikacji. Możesz pobrać prawa osadzania czcionki dla czcionki, tworząc obiekt GlyphTypeface i odwołując się do jej właściwości EmbeddingRights. Aby uzyskać więcej informacji na temat flagi fsType, zapoznaj się z sekcją „Metryki OS/2 i Windows” specyfikacji OpenType.

Strona internetowa Microsoft Typography zawiera informacje kontaktowe, które mogą pomóc w znalezieniu określonego dostawcy czcionek lub dostawcy do zleceń indywidualnych.

Dodawanie czcionek jako elementów zawartości

Możesz dodawać czcionki do aplikacji jako elementy zawartości projektu, które są oddzielone od plików zestawów aplikacji. Oznacza to, że elementy zawartości nie są osadzone jako zasoby w zestawie. Poniższy przykładowy plik projektu przedstawia sposób definiowania elementów zawartości.

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

Aby upewnić się, że aplikacja może używać czcionek w czasie wykonywania, czcionki muszą być dostępne w katalogu wdrażania aplikacji. Element <CopyToOutputDirectory> w pliku projektu aplikacji umożliwia automatyczne kopiowanie czcionek do katalogu wdrażania aplikacji podczas procesu kompilacji. Poniższy przykładowy plik projektu pokazuje, jak skopiować czcionki do katalogu wdrożenia.

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

Poniższy przykład kodu przedstawia sposób odwoływania się do czcionki aplikacji jako elementu zawartości — element zawartości, do których odwołuje się odwołanie, musi znajdować się w tym samym katalogu co pliki zestawów aplikacji.

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

Dodawanie czcionek jako elementów zasobów

Możesz dodawać czcionki do aplikacji jako elementy zasobów projektu osadzone w plikach zestawów aplikacji. Użycie oddzielnego podkatalogu dla zasobów ułatwia organizowanie plików projektu aplikacji. Poniższy przykładowy plik projektu pokazuje, jak zdefiniować czcionki jako elementy zasobów w osobnym podkatalogu.

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

Notatka

Podczas dodawania czcionek jako zasobów do aplikacji upewnij się, że ustawiasz element <Resource>, a nie element <EmbeddedResource> w pliku projektu aplikacji. Element <EmbeddedResource> działania kompilacji nie jest obsługiwany.

Poniższy przykład znaczników przedstawia sposób odwołowania się do zasobów czcionek aplikacji.

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

Odwoływanie się do elementów zasobu czcionki z kodu

Aby odwoływać się do elementów zasobów czcionki z kodu, należy podać dwuczęściowe odwołanie do zasobu czcionki: podstawowy jednolity identyfikator zasobu (URI); oraz odwołanie do lokalizacji czcionki. Te wartości są używane jako parametry metody FontFamily. Poniższy przykład kodu pokazuje, jak odwoływać się do zasobów czcionek aplikacji w podkatalogu projektu o nazwie 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")

Podstawowy jednolity identyfikator zasobu (URI) może zawierać podkatalog aplikacji, w którym znajduje się zasób czcionki. W takim przypadku odwołanie do lokalizacji czcionki nie musi określać katalogu, ale musi zawierać wiodący "./", który wskazuje, że zasób czcionki znajduje się w tym samym katalogu określonym przez podstawowy jednolity identyfikator zasobu (URI). Poniższy przykład kodu przedstawia alternatywny sposób odwoływania się do elementu zasobu czcionki — jest on odpowiednikiem poprzedniego przykładu kodu.

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

Odwoływanie się do czcionek z tego samego podkatalogu aplikacji

Zawartość aplikacji i pliki zasobów można umieścić w tym samym podkatalogu zdefiniowanym przez użytkownika w projekcie aplikacji. Poniższy przykładowy plik projektu przedstawia stronę zawartości i zasoby czcionek zdefiniowane w tym samym podkatalogu.

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

Ponieważ zawartość i czcionka aplikacji znajdują się w tym samym podkatalogu, odwołanie do czcionki jest powiązane z zawartością aplikacji. W poniższych przykładach pokazano, jak odwoływać się do zasobu czcionki aplikacji, gdy czcionka znajduje się w tym samym katalogu co aplikacja.

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

Wyliczanie czcionek w aplikacji

Aby wyliczyć czcionki jako elementy zasobów w aplikacji, użyj metody GetFontFamilies lub GetTypefaces. W poniższym przykładzie pokazano, jak za pomocą metody GetFontFamilies zwrócić kolekcję obiektów FontFamily z lokalizacji czcionki aplikacji. W takim przypadku aplikacja zawiera podkatalog o nazwie "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

W poniższym przykładzie pokazano, jak za pomocą metody GetTypefaces zwrócić kolekcję obiektów Typeface z lokalizacji czcionki aplikacji. W takim przypadku aplikacja zawiera podkatalog o nazwie "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

Tworzenie biblioteki zasobów czcionek

Możesz utworzyć bibliotekę tylko dla zasobów zawierającą tylko czcionki — żaden kod nie jest częścią tego typu projektu biblioteki. Tworzenie biblioteki zawierającej tylko zasoby jest typową techniką oddzielenia zasobów od kodu aplikacji, który z nich korzysta. Umożliwia to również dołączanie zestawu biblioteki do wielu projektów aplikacji. Poniższy przykładowy plik projektu ilustruje kluczowe części projektu biblioteki zasobów.

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

Odwoływanie się do czcionki w bibliotece zasobów

Aby odwołać się do czcionki w bibliotece zasobów z aplikacji, należy poprzedzić odwołanie do czcionki nazwą zestawu biblioteki. W takim przypadku zestaw zasobów czcionki to "FontLibrary". Aby oddzielić nazwę zestawu od odwołania w zestawie, użyj znaku ;. Dodanie słowa kluczowego "Component", po którym następuje odwołanie do nazwy czcionki, kończy pełne odwołanie do zasobu biblioteki czcionek. Poniższy przykład kodu przedstawia sposób odwołowania się do czcionki w zestawie biblioteki zasobów.

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

Uwaga

Ten zestaw SDK zawiera zestaw przykładowych czcionek OpenType, których można używać z aplikacjami WPF. Czcionki są definiowane w bibliotece tylko dla zasobów. Aby uzyskać więcej informacji, zobacz Sample OpenType Font Pack.

Ograniczenia dotyczące użycia czcionek

Na poniższej liście opisano kilka ograniczeń dotyczących pakowania i używania czcionek w aplikacjach WPF:

  • bity uprawnień osadzania czcionek: aplikacje WPF nie sprawdzają ani nie wymuszają żadnych bitów uprawnień osadzania czcionek. Aby uzyskać więcej informacji, zobacz sekcję Introduction_to_Packing Fonts.

  • Czcionki lokacji pochodzenia: aplikacje WPF nie zezwalają na odwołanie do czcionek http lub ftp uniform resource identifier (URI).

  • Bezwzględny identyfikator URI używający notacji "pack:": Aplikacje WPF nie pozwalają na programowe tworzenie obiektu FontFamily z użyciem "pack:" jako części bezwzględnego identyfikatora URI odniesienia do czcionki. Na przykład "pack://application:,,,/resources/#Pericles Light" jest nieprawidłowym odwołaniem do czcionek.

  • automatyczne osadzanie czcionek: W czasie projektowania nie ma obsługi wyszukiwania czcionek w aplikacji i automatycznego osadzania czcionek w zasobach aplikacji.

  • podzestawy czcionek: aplikacje WPF nie obsługują tworzenia podzbiorów czcionek dla dokumentów niestałych.

  • W przypadkach, gdy istnieje nieprawidłowe odwołanie, aplikacja wraca do korzystania z dostępnej czcionki.

Zobacz też