Pakowanie czcionek z aplikacjami

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

Uwaga

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 czcionek pakietów

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ć oddzielone od plików zestawów aplikacji lub osadzone. Możesz również utworzyć bibliotekę czcionek tylko dla zasobów, do której może odwoływać się aplikacja.

Czcionki OpenType i TrueType® zawierają flagę typu fsType, która wskazuje na osadzanie praw licencjonowania czcionek dla czcionki. 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 GlyphTypeface obiekt i odwołując się do jej EmbeddingRights właściwości. Aby uzyskać więcej informacji na temat flagi fsType, zapoznaj się z sekcją "Metryki systemu operacyjnego/2 i systemu Windows" specyfikacji OpenType.

Witryna sieci Web Typography firmy Microsoft zawiera informacje kontaktowe, które mogą pomóc w zlokalizowaniu określonego dostawcy czcionek lub znalezieniu dostawcy czcionek do pracy niestandardowej.

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>  

Uwaga

Podczas dodawania czcionek jako zasobów do aplikacji upewnij się, że element jest ustawiany <Resource> , a nie <EmbeddedResource> element w pliku projektu aplikacji. Element <EmbeddedResource> akcji 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 FontFamily metody . 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 GetFontFamilies metody lub GetTypefaces . W poniższym przykładzie pokazano, jak za pomocą GetFontFamilies metody zwracać kolekcję FontFamily obiektów 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ą GetTypefaces metody zwracać kolekcję Typeface obiektów 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 tylko do zasobów jest typową techniką oddzielenia zasobów z 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 przedstawia kluczowe części projektu biblioteki tylko dla 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 prefiks odwołania do czcionki o nazwie 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 Przykładowy pakiet czcionek OpenType.

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

  • Czcionki źródła: aplikacje WPF nie zezwalają na odwołanie czcionek do identyfikatora URI (URI) http lub FTP.

  • Bezwzględny identyfikator URI przy użyciu notacji pakietu: aplikacje WPF nie umożliwiają programowego tworzenia FontFamily obiektu przy użyciu "pack:" jako części bezwzględnego identyfikatora URI (URI) odwołania do czcionki. Na przykład "pack://application:,,,/resources/#Pericles Light" jest nieprawidłowym odwołaniem do czcionki.

  • 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 podzestawó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ż