2012-05-09 16 views
11

Tengo una aplicación que utiliza un conjunto de biblioteca separado para los recursos (pero no un ensamblado de solo recursos sin código), y me gustaría incluir una fuente personalizada en la biblioteca.En WPF, ¿cómo hago referencia a una fuente en una biblioteca de recursos en el código?

Puedo obtener la fuente, que es Open Type Font, para cargar si agrego su archivo .otf como un recurso para el proyecto para el ensamblaje en ejecución (en lugar del proyecto de la biblioteca de recursos), con las propiedades establecidas como construir Acción = 'recurso' y copiar a la salida = 'no copiar', utilizando el siguiente código:

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

Cuando intento agregar la fuente al proyecto biblioteca de recursos, sin embargo, la fuente no se carga . He intentado utilizar el siguiente código para cargarlo (también de la nota: no tengo mucha experiencia con los URI del paquete):

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 . 

La biblioteca funciona para otros recursos, como imágenes.

También he intentado un montón de otras permutaciones para el URI sin éxito (tampoco arroja excepciones, solo muestra con la fuente predeterminada, no estoy seguro de si se trata de un problema diferente).

He estado trabajando desde Packaging Fonts with Applications en MSDN, que tiene un ejemplo de creación de una biblioteca de recursos de fuentes, pero no hay ejemplos usando código detrás (me veo obligado a usar código para esto).

¿Alguna idea sobre lo que debo hacer? ¿Estoy fuera de la pista?

Respuesta

15

Lo tengo trabajando en mi aplicación (cargar fuentes desde otro ensamblado en código subyacente). Para una fuente URI de la siguiente manera:

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

La forma en que tengo que trabajar (después de la dolorosa prueba y error, si no recuerdo mal) es:

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

Espero que ayude.

+0

esto no funcionó para mí, lo que sugiere que tengo alguna otra problema ya que está funcionando para usted. – Pysul

+0

Gracias, para mí funcionó ... ¡me salvó un montón de prueba y error! – yvesonline

+0

¡Puedo confirmar que funciona perfectamente y antes de probar demasiadas combinaciones de carga sin éxito! Pensé que un acceso relativo a los recursos desde dentro de dll sería suficiente, pero aparentemente se requiere agregar el nombre del ensamblado, ¡incluso si se debe acceder a las fuentes desde el mismo ensamblado! – too

1

WPF no admite la creación del objeto FontFamily programáticamente utilizando la notación de paquete.

Los documentos dicen que, al final de la página, here

Esta es la cita:

absoluta URI utilizando el paquete: notación: aplicaciones WPF no le permiten crear una El objeto FontFamily usa programáticamente "paquete:" como parte de la referencia del identificador de recursos uniforme (URI) absoluto a una fuente. Por ejemplo, "paquete: // aplicación: ,,,/recursos/# Pericles Light" es una referencia de fuente no válida.

+0

Entonces, ¿por qué funciona para algunas personas? – IneedHelp

+0

Bueno, sin mirar el código ni siquiera pude comenzar a comprender. Pero los documentos dicen que no. Yo diría que los documentos son de confianza :) – Ninglin

+0

Quiero decir que los chicos en el post anterior dicen que lograron hacer que funcione, pero tienes razón, la documentación tiene más credibilidad. – IneedHelp

0

(lo sé, vieja pregunta, pero no he encontrado una respuesta correcta.)

la respuesta de la Ross sólo funciona en algunas versiones de la NETFramework. (No funciona en netframework 4.6)

Creo que esta es la mejor respuesta:

Enumeración de fuentes en una aplicación:

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

reference

Cuestiones relacionadas