2010-06-14 3 views
5

J'ai créé un dictionnaire de ressources que je souhaite fusionner avec plusieurs fichiers xaml usercontrol. Je veux qu'une seule instance de ce dictionnaire de ressources soit créée. Une idée de comment faire cela?Création d'un dictionnaire de ressources statiques

Remarque: La fusion doit se faire uniquement via xaml et non via le code.

Merci & Cordialement, Vishal

Répondre

3

Que pensez-vous de cela?

class DictionaryExtensions 
{ 
    public static ResourceDictionary MyResourceDictionary; 

    static DictionaryExtensions() 
    { 
     MyResourceDictionary = new ResourceDictionary(); 
     Style buttonStyle = new Style() { TargetType = typeof(Button) }; 
     buttonStyle.Setters.Add(new Setter(Button.MarginProperty, new Thickness(5))); 
     buttonStyle.Setters.Add(new Setter(Button.PaddingProperty, new Thickness(5))); 
     buttonStyle.Setters.Add(new Setter(Button.MaxWidthProperty, 100.0d)); 
     MyResourceDictionary.Add("buttonStyle", buttonStyle); 
    } 

    public static Type GetMyDictionary(DependencyObject obj) 
    { 
     return (Type)obj.GetValue(MyDictionaryProperty); 
    } 

    public static void SetMyDictionary(DependencyObject obj, Type value) 
    { 
     obj.SetValue(MyDictionaryProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for MyDictionary. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty MyDictionaryProperty = 
     DependencyProperty.RegisterAttached("MyDictionary", typeof(Type), typeof(UserControl), new UIPropertyMetadata(new PropertyChangedCallback(OnMyDictionaryChanged))); 

    public static void OnMyDictionaryChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (d is UserControl) 
     { 
      (d as UserControl).Resources.MergedDictionaries.Add(MyResourceDictionary); 
     } 
    } 
} 

XAML:

<UserControl x:Class="WpfSOTest.UserControl1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfSOTest" 
     mc:Ignorable="d" 
     d:DesignHeight="300" 
     d:DesignWidth="300" 
     local:DictionaryExtensions.MyDictionary="{x:Type ResourceDictionary}"> 
<Grid> 
    <StackPanel> 
     <Button Style="{StaticResource buttonStyle}" 
       Content="Button1" /> 
     <Button Style="{StaticResource buttonStyle}" 
       Content="Button2" /> 
    </StackPanel> 
</Grid> 

Vous pouvez utiliser l'objet Type de choisir dynamiquement entre plusieurs dictionnaires.

+0

Merci beaucoup decyclone !!! Votre solution a fonctionné pour moi :-) – Vishal

1

Si c'est vous pouvez vraiment peut-être global, fusionner ce dictionnaire app.xaml?

+0

Non. Ce n'est pas global. C'est dans une bibliothèque de classes et le projet exécutable principal n'est pas au courant de ce dictionnaire de ressources. – Vishal

Questions connexes