2011-07-20 14 views
8

Hay una biblioteca de control de usuario de WPF y dos (o más) controles de usuario en ella. Necesito usar el mismo estilo en ambos controles de usuario. ¿Cómo puedo compartir este estilo? Por ejemplo:¿Cuál es la forma más fácil de compartir recursos entre UserControls en una biblioteca de control de usuario de WPF?

Este es el estilo: el control

<Style x:Key="customLabelStyle" TargetType="Label"> 
    ... 
</Style> 

Usuario A:

<UserControl x:Class="Edu.Wpf.Example.UserControlA" 
    ...xmlns stuff... > 
    <Grid> 
     ... some xaml markup... 
     <Label Style="{StaticResource customLabelStyle}"/> 
    </Grid> 
</UserControl> 

control de usuario B:

<UserControl x:Class="Edu.Wpf.Example.UserControlB" 
    ...xmlns stuff... > 
    <Grid> 
     ... some another xaml markup... 
     <Label Style="{StaticResource customLabelStyle}"/> 
    </Grid> 
</UserControl> 

Entonces, ¿cómo puedo compartir este estilo entre el usuario controles en la biblioteca sin la participación de la aplicación app.xaml diccionario de recursos?

ACTUALIZACIÓN

puedo añadir Temas \ Generic.xaml en mi biblioteca y definir el estilo allí. Pero en este caso tengo que usar ComponentResourceKey como la clave del estilo. ¿Derecha? Es una expresión larga y no muy útil ...

Respuesta

2

Puede definir los recursos compartidos en un ResourceDictionary por separado, luego combinarlos en los recursos de UserControl utilizando MergedDictionaries.

12

decir que usted tiene una definición de recursos colores, así:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Color A="#FF" R="#FF" G="#22" B="#11" x:Key="MyRed"/> 
    <Color A="#FF" R="#00" G="#FF" B="#21" x:Key="MyGreen"/> 
    <Color A="#FF" R="#00" G="#22" B="#FF" x:Key="MyBlue" /> 


    <SolidColorBrush x:Key="MyGreenBrush" Color="{StaticResource MyGreen}"/> 
    <SolidColorBrush x:Key="MyRedBrush" Color="{StaticResource MyRed}"/> 
    <SolidColorBrush x:Key="MyBlueBrush" Color="{StaticResource MyBlue}"/> 
</ResourceDictionary> 

y otro definiendo algunos estilos básicos como esto:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style TargetType="{x:Type TextBlock}" x:Key="PocTextBlock"> 
     <Setter Property="FontSize" Value="16"/> 
    </Style> 

    <Style TargetType="{x:Type TextBox}" x:Key="MyTextBox"> 
     <Setter Property="FontSize" Value="20"/> 
     <Setter Property="Foreground" Value="{DynamicResource MyGreenBrush}"/> 
    </Style> 

    <Style TargetType="{x:Type TextBlock}" x:Key="MyResultTextBlock"> 
     <Setter Property="FontSize" Value="16"/> 
     <Setter Property="FontWeight" Value="Bold"/> 
     <Setter Property="Foreground" Value="{DynamicResource MyGreenBrush}"/> 
    </Style> 

    <Style TargetType="{x:Type Border}" x:Key="MyBorder"> 
     <Setter Property="BorderBrush" Value="{DynamicResource MyGreenBrush}"/> 
     <Setter Property="BorderThickness" Value="4"/> 
     <Setter Property="CornerRadius" Value="5"/> 
    </Style> 
</ResourceDictionary> 

A continuación, puede añadir sus recursos a la App. Application.Resources etiqueta de xaml como se muestra aquí:

<Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="OtherStyles.xaml"/> 
       <ResourceDictionary Source="Colors.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Entonces, en todas sus UserControls, se puede usar los estilos o pinceles como StaticResources como muestra su código de ejemplo.

+3

Es una biblioteca de complementos. Entonces no puedo usar App.xaml. – sedovav

+1

Es posible vincular otros módulos en App.xaml utilizando la siguiente convención al agregar ResourceDictionaries:

+1

como largo es biblioteca de complementos No puedo usar enlaces a ella en la aplicación principal – sedovav

1

he encontrado la solución que funciona en tiempo de diseño también (al menos en VS2010):

public static class Resource 
{ 
    private static readonly Dictionary<Uri, ResourceDictionary> SharedDictinaries = new Dictionary<Uri, ResourceDictionary>(); 

    private static void onMergedDictionaryChanged(DependencyObject source, DependencyPropertyChangedEventArgs args) 
    { 
     FrameworkElement el = source as FrameworkElement; 
     if (el == null) 
      return; 

     Uri resourceLocator = new Uri(GetMergedDictionary(source), UriKind.Relative); 
     ResourceDictionary dictionary; 
     if (SharedDictinaries.ContainsKey(resourceLocator)) 
      dictionary = SharedDictinaries[resourceLocator]; 
     else 
     { 
      dictionary = (ResourceDictionary)Application.LoadComponent(resourceLocator); 
      SharedDictinaries.Add(resourceLocator, dictionary); 
     } 

     el.Resources.MergedDictionaries.Add(dictionary); 
    } 

    public static readonly DependencyProperty MergedDictionaryProperty = 
     DependencyProperty.RegisterAttached("MergedDictionary", typeof (String), typeof (Resource), new FrameworkPropertyMetadata(null, onMergedDictionaryChanged)); 

    [AttachedPropertyBrowsableForType(typeof(FrameworkElement))] 
    public static String GetMergedDictionary(DependencyObject source) 
    { 
     return (String) source.GetValue(MergedDictionaryProperty); 
    } 

    public static void SetMergedDictionary(DependencyObject source, String value) 
    { 
     source.SetValue(MergedDictionaryProperty, value); 
    } 
} 

Esta propiedad adjunta se puede aplicar a un FrameworkElement. Imagine que customLabelStyle se define en el diccionario Styles.xaml en el proyecto Edu.Wpf.Example. Entonces este estilo se puede aplicar de la siguiente manera:

<UserControl x:Class="Edu.Wpf.Example.UserControlA" 
    ... 
    xmlns:res="clr-namespace:Edu.Wpf.Example.Resources" 
    res:Resource.MergedDictionary="/Edu.Wpf.Example;component/Resources/Styles.xaml"> 
    ... 
    <Label Style="{StaticResource customLabelStyle}"/> 
</UserControl> 
+0

Al final no me molesté con todo esto adjunto y simplemente agregué uri directo al diccionario de recursos de estilos (sintaxis "paquete") en ambos controles de usuario en 'UserControl.Resources'. Es mejor manejado por ReSharper. – sedovav

Cuestiones relacionadas