2010-01-18 33 views
5

He publicado una pregunta hace unos meses acerca de sharing resource dictionaries across assemblies. Resulta que puede hacerlo utilizando la extensión de marcado de clave de recursos de componentes. En ese momento, solo podía hacer que funcionara con un proyecto de control personalizado de WPF, no con un proyecto simple de biblioteca de clases.¿Diferencias entre la Biblioteca de control personalizado de WPF y la Biblioteca de clases simple?

Ahora necesito usar un proyecto de Biblioteca de clases simple existente para alojar un diccionario de recursos compartidos. Eso significa que necesito adaptar el proyecto de biblioteca de clases para admitir la extensión de marcado de clave de recursos de componentes. Agregué una carpeta Temas y un documento de diccionario de recursos Generic.xaml al proyecto Biblioteca de clases, así como referencias a PresentationCore, PresentationFramework y WindowsBase. Desafortunadamente, eso no parece ser el truco.

Entonces, esta es mi pregunta: ¿Aparte de lo anterior, qué tiene un proyecto de biblioteca de control personalizado de WPF que no tiene un proyecto simple de biblioteca de clases? O, para decirlo de otra manera, ¿qué más podría agregar a mi proyecto de biblioteca de clase para que funcione esta característica? Gracias.

+0

La extensión de marca de clave de recursos de componente no funciona. Configuré dos soluciones idénticas, una con una biblioteca de control personalizada y la otra con una biblioteca de clases simple con los archivos DLL refs y Themes/Generic.xaml. La extensión de marcado de la clave de recursos del componente funciona en la Biblioteca de control personalizado, pero no en la Biblioteca de clases. –

+0

He solucionado el problema reemplazando la antigua Biblioteca de clases con una Biblioteca de control personalizada y moviendo todas las clases de la Biblioteca de clases a la Biblioteca de control personalizado. Pero aún me gustaría descubrir cómo adaptar una Biblioteca de clases, porque probablemente me encuentre con esto otra vez. –

+0

Extraño. Lo siguiente funcionó para mí: crear un proyecto de biblioteca de clase, agregar referencias de WPF DLL, agregar un Themes/Generic.xaml (ninguna opción de diccionario de recursos creada como UserControl y XAML editado para ser un ResourceDictionary), crear un CRK en una clase (basado en su pregunta vinculada), agregó un recurso a generic.xaml con x: clave establecida en ese CRK. Compila bien para mí (VS2008 SP1). No necesitaba el ThemeInfoAttribute que menciona Cameron. ¿Valdría la pena publicar su archivo XAML? – itowlson

Respuesta

6

Además de las referencias WPF adicionales, la plantilla Biblioteca de control personalizado de WPF tiene un atributo adicional en AssemblyInfo.

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
)] 

ThemeInfoAttribute especifica la ubicación en la que los diccionarios temáticos se almacenan para este tipo en una asamblea.

+0

Tenga en cuenta que no he probado esta solución, pero ciertamente tiene sentido. Esperaría la falta de ese atributo para el soporte de temas diables/generic.xaml. –

1

La respuesta de Cameron MacFarland fue perfecta. Ahora lo he probado y funciona.

Aquí está la solución: Agregue las referencias DLL y el archivo Themes/generic.xaml al proyecto simple de la Biblioteca de clases. Entonces, AssemblyInfo.cs abiertos y añadir el siguiente código al final del archivo:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
)] 

recompilación, y la extensión de marcado Clave de Recursos componentes deben trabajar.

+0

Encontré una solución más simple para el uso compartido de recursos de ensamblaje cruzado, utilizando URI de paquete en lugar de ComponentResourceKeys.El enfoque está documentado aquí: http://stackoverflow.com/questions/2095031/wpf-sharing-resources-across-assemblies –

2

Otra diferencia está en el archivo .csproj:

En la biblioteca de clases falta la etiqueta:

<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> 

Después de añadir a la primera PropertyGroup, el menú complemento del proyecto muestra ahora la típica Archivos WPF.

Cuestiones relacionadas