Cómo hacer referencia a las claves de estilo de WPF definidos en una asamblea independiente en otra biblioteca

StackOverflow https://stackoverflow.com/questions/2184871

Pregunta

Tengo dos bibliotecas y un único diseño del proyecto conjunto de aplicación y me pregunto cómo puedo hacer referencia a lo estilos por su llave en una de mis bibliotecas que está indicada en el otro.

Mi diseño de solución:

  • WpfControls.dll - Mantiene controles reutilizables genéricas tales como un control basado en WPF NumericUpDown así como otros controles básicos y algunos estilos, así que me gustaría hacer reutilizable. Por el bien del ejemplo digamos que mi clave de estilo aquí se define como MyButtonStyle .
  • SpecializedControls.dll - Contiene controles que se especializan a nuestra aplicación, tales como controles de compuestos y UserControls en WPF. Aquí es donde me gustaría hacer referencia al MyButtonStyle estilo definido en WpfControls.dll montaje.
  • aplicación.exe -. Esto utiliza montaje controles definidos en el SpecializedControls.dll montaje

he visto algunos ejemplos que explican cómo hacer esto con una simple biblioteca de control único y la aplicación de montaje, pero en mi caso tengo dos conjuntos y una aplicación. Así, en otras palabras, en mi caso no tengo una App.xaml en mi segunda biblioteca de control en el que podía utilizar el concepto MergeDictionaries. Estoy bastante seguro de que si quería podía poner hacer referencia a un MergedDictionaries directamente en cada archivo de controles XAML para fusionar todos Generic.xaml definido en WpfControls.dll Asamblea, pero yo creo que esto daría lugar a estilos se fusionaron de forma redundante en varios lugares en mis SpecializedControls de montaje, que no parece ser la mejor solución. Por si fuera poco, estos diccionarios también podrían fusionarse en aplicación.exe así, ¿esto comienzan a hincharse mi aplicación en tiempo de ejecución?

¿Alguien puede aclarar lo que el recomendado o mejor enfoque para compartir estos estilos con la menor cantidad de sobrecarga programtic y recursos.

Actualizar : Después de un poco más de las pruebas parece que estoy teniendo problemas para hacer referencia a cualquier recurso definido dentro Generic.xaml por él es clave, incluso dentro del mismo conjunto. Puede haber algo totalmente equivocado acerca de cómo estoy comprensión de cómo funcionan las teclas de recursos por lo que voy a tener que investigar un poco más, así como mirar en ComponentResourceKey. Si alguien tiene alguna pista o sugerencia, por favor ayuda.

¿Fue útil?

Solución

de búsqueda de recursos en WPF trabaja en una jerarquía:. El árbol lógico, entonces los recursos de aplicaciones, recursos temáticos y, finalmente, los recursos del sistema

recursos del tema por lo general sólo se puede acceder de forma implícita (incluso dentro del conjunto están definidos). Esto sólo es relevante para los estilos, donde el TargetType se puede utilizar como la clave implícita.

Para lograr lo que estamos tratando de hacer, hay dos opciones:

  • Utilice un ComponentResourceKey . Esta es una clave de recurso especial que permite que los recursos que hacen referencia a otros ensamblados. Por ejemplo, puede definir un pincel en WpfControls diccionario tema:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    Y a continuación, puede hacer referencia a ella en SpecializedControls

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • Uso MergedDictionaries para importar un diccionario en los recursos de la aplicación. Puede hacer esto en el Aplicación montaje, y cuando se carga la aplicación, incluso los controles que se encuentran en SpecializedControls serían capaces de utilizar estos recursos. Va a tener un problema con la experiencia en tiempo de diseño en este escenario, que se puede solucionar poniendo una falsa App.xaml en SpecializedControls , que también podría contener una referencia al diccionario.

Espero que esta ayuda,

Aelij.

Otros consejos

La respuesta aceptada es correcta, sólo estoy explicando cómo utilizar MergedDictionaries

En App.xaml ,

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top