2010-06-14 18 views
5

Ho creato un dizionario di risorse che desidero unire con più file di uscontrol xaml. Voglio solo una istanza di questo Dizionario delle risorse da creare. Qualche idea su come fare questo?Creazione del dizionario di risorse statiche

Nota: l'unione deve avvenire solo tramite xaml e non tramite il codice.

Grazie & saluti, Vishal

risposta

3

Che ne dici di questo?

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> 

È possibile utilizzare l'oggetto Tipo di scegliere dinamicamente tra più dizionari.

+0

Grazie mille decyclone !!! La tua soluzione ha funzionato per me :-) – Vishal

1

Se è veramente globale, forse si potrebbe fondere questo dizionario per App.xaml?

+0

No. Non è globale. Si trova all'interno di una libreria di classi e il progetto eseguibile principale non è a conoscenza di questo dizionario delle risorse. – Vishal

Problemi correlati