2012-05-09 6 views
11

Ich habe eine Anwendung, die eine separate Bibliothek Assembly für Ressourcen verwendet (aber keine Nur-Ressourcen-Assembly ohne Code), und ich möchte eine benutzerdefinierte Schriftart in die Bibliothek aufnehmen.Wie kann ich in WPF auf eine Schriftart in einer Ressourcenbibliothek im Code verweisen?

Ich kann die Schriftart, die eine Open Type Font ist, laden, wenn ich seine .otf-Datei als Ressource zum Projekt für die ausführende Assembly hinzufügen (anstatt zum Ressourcenbibliotheksprojekt), mit Eigenschaften als gesetzt bauen Action = ‚Resource‘ und kopieren Output = ‚nicht kopieren‘, indem Sie den folgenden Code:

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

Wenn ich versuche, die Schriftart auf die Ressource-Bibliothek Projekt hinzuzufügen, jedoch die Schriftart nicht geladen werden . Ich habe versucht, mit dem folgenden Code zu laden (auch der Anmerkung: Ich habe nicht viel Erfahrung mit Paket-URIs):

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 . 

Die Bibliothek funktioniert für andere Ressourcen wie Bilder.

Ich habe auch eine Reihe von anderen Permutationen für den URI mit keinem Erfolg versucht (es wirft auch keine Ausnahmen, zeigt nur mit der Standardschrift, nicht sicher, ob dies ein separates Problem ist).

Ich habe von Packaging Fonts with Applications auf MSDN gearbeitet, die ein Beispiel zum Erstellen einer Font-Ressource-Bibliothek, aber keine Beispiele mit Code hinter hat (ich bin gezwungen, Code dahinter zu verwenden).

Irgendwelche Ideen über was ich tun muss? Bin ich aus der Spur?

Antwort

15

Ich habe es in meiner Anwendung (Laden von Schriftarten aus einer anderen Assembly in Code-behind). Für eine Schriftart wie diese URI:

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

Die Art und Weise habe ich es (nach dem schmerzhaften Versuch und Irrtum, wenn ich mich richtig erinnere) zu arbeiten ist:

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

Hoffnung, das hilft.

+0

Das ist für mich nicht funktioniert hat, was ich habe einige andere schlägt vor, Problem, da es für Sie arbeitet. – Pysul

+0

Danke, für mich hat es geklappt ... hat mir eine Menge Versuch und Irrtum erspart! – yvesonline

+0

Ich kann bestätigen, es funktioniert perfekt und bevor ich viel zu viele Kombinationen von Laden ohne Erfolg versuchte !!! Ich dachte, ein relativer Zugriff auf Ressourcen von innerhalb dll wäre genug, aber offensichtlich Hinzufügen von Assembly-Namen ist erforderlich, auch wenn Schriften sollten von der gleichen Baugruppe zugegriffen werden! – too

1

WPF unterstützt nicht das programmgesteuerte Erstellen des FontFamily-Objekts mithilfe der Paketnotation.

Die docs sagen, dass es am Ende der Seite, here

Hier ist das Zitat:

Absolute URI mit der Packung: Notation: WPF-Anwendungen nicht erlauben Sie erstellen FontFamily-Objekt, das programmgesteuert "pack:" als Teil des absoluten Uniform Resource Identifier (URI) Verweis auf eine Schriftart verwendet. Zum Beispiel ist "pack: // application: ,,,/resources/# Pericles Light" eine ungültige Font-Referenz.

+0

Also warum funktioniert es für manche Leute? – IneedHelp

+0

Nun, ohne den Code zu betrachten, konnte ich nicht einmal begreifen. Aber die Ärzte sagen, dass es nicht so ist. Ich würde sagen, die Dokumente sind vertrauenswürdig :) – Ninglin

+0

Ich meine die Jungs in der Post oben sagen, sie haben es geschafft, es funktioniert, aber Sie haben Recht, die Dokumentation hat mehr Glaubwürdigkeit. – IneedHelp

0

(Ich weiß, alte Frage, aber ich habe nicht eine richtige Antwort finden.)

die Antwort des Ross funktioniert nur in einigen Versionen des Netframework. (Funktioniert nicht am Netframework 4.6)

Ich denke, das ist die beste Antwort:

Schriftarten in einer Anwendung Aufzählen:

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

reference

Verwandte Themen