2012-05-09 19 views
11

Mam aplikację, która używa oddzielnego zespołu biblioteki dla zasobów (ale nie jest to tylko zbiór zasobów bez kodu) i chciałbym dołączyć niestandardową czcionkę do biblioteki.W WPF, jak odniesienie do czcionki w bibliotece zasobów w kodzie?

Jestem w stanie pobrać czcionkę, która jest Open Type Font, aby załadować, jeśli dodaję jej plik .otf jako zasób do projektu dla zespołu wykonującego (zamiast do projektu biblioteki zasobów), z właściwościami ustawionymi jako Budowanie Action = „Zasoby” i Copy to Output = „nie kopiuj”, za pomocą następującego kodu:

FontFamily font = new FontFamily(new Uri("pack://application:,,,/"), 
         "./Resources/#CustomFont")); // Resources is a subfolder 

Gdy próbuję dodać czcionkę do projektu biblioteki zasobów, jednak czcionka nie ładuje . Próbowałem za pomocą poniższego kodu, aby go załadować (również z dopiskiem: Nie mam dużego doświadczenia z URI Pack):

FontFamily font = new FontFamily(new Uri("pack://application:,,,/MyLibrary"), 
         "./Resources/#CustomFont")); 
         // there is a Resources subfolder in my library as well 
         // not sure about whether I need the . 

Biblioteka działa dla innych zasobów, takich jak obrazy.

Próbowałem również kilka innych permutacji dla URI bez powodzenia (nie rzuca wyjątków, tylko wyświetla z domyślną czcionką, nie jestem pewien, czy jest to osobny problem).

Pracuję od Packaging Fonts with Applications na MSDN, który ma przykład tworzenia biblioteki zasobów czcionek, ale brak przykładów używających kodu za (jestem zmuszony do użycia kodu za tym).

Jakieś pomysły na temat tego, co muszę zrobić? Czy jestem poza trasą?

Odpowiedz

15

Mam to działa w mojej aplikacji (ładowanie czcionek z innego zestawu w kodzie z tyłu). Dla czcionki URI jak ten:

pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/#Swis721 Md BT 

Sposób mam go do pracy (po bolesnych prób i błędów, jeśli dobrze pamiętam) to:

new FontFamily(
    new Uri("pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/"), 
    "./#Swis721 Md BT" 
) 

nadzieję, że pomoże.

+0

To nie dla mnie, co sugeruje, mam jakiś inny problem, ponieważ to działa dla ciebie. – Pysul

+0

Dzięki, dla mnie to zadziałało ... zaoszczędziło mi wiele prób i błędów! – yvesonline

+0

Mogę potwierdzić, że działa idealnie i zanim spróbowałem zbyt wiele kombinacji ładowań bez powodzenia !!! Myślałem, że względny dostęp do zasobów z wewnątrz dll będzie wystarczający, ale najwyraźniej dodanie nazwy zespołu jest wymagane, nawet jeśli czcionki powinny być dostępne z tego samego zestawu! – too

1

WPF nie obsługuje tworzenia obiektu FontFamily programowo za pomocą notacji pack.

Docs powiedzieć, że w końcu stronie here

Oto cytat:

Absolute URI użyciu pakiet: notacja: Aplikacje WPF nie pozwalają stworzyć Obiekt FontFamily programowo wykorzystujący "pack:" jako część absolutnego jednolitego identyfikatora zasobu (URI) odniesienia do czcionki. Na przykład "pack: // application :,,/resources/# Perykles Light" jest niepoprawnym odnośnikiem do czcionki.

+0

Dlaczego to działa dla niektórych osób? – IneedHelp

+0

Cóż, nie patrząc na kod, nie mogłem nawet zacząć pojmować. Ale doktorzy twierdzą, że tak nie jest. Powiedziałbym, że dokumenty mają być zaufane :) – Ninglin

+0

Mam na myśli facetów w poście powyżej powiedzieć, że udało im się to działa, ale masz rację, dokumentacja ma większą wiarygodność. – IneedHelp

0

(wiem, stare pytanie, ale nie mogę znaleźć prawidłową odpowiedź.)

Ross za odpowiedź działa tylko w niektórych wersjach netframework. (Nie działa w Netgramework 4.6)

myślę, że to jest najlepsza odpowiedź:

Wyliczanie czcionek w aplikacji:

foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/")) 
      { 
       // Perform action. 
      } 

reference

Powiązane problemy