Domanda

Ho una serie di stili e pennelli definiti in un ResourceDictionary che sto caricando come un MergedDictionary in XAML dal mio controllo di livello superiore:

<ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>

Sto cercando di facoltativamente sostituire alcuni di questi stili e spazzole se un file XAML diversa esiste nella XAP con la propria ResourceDictionary. Sto cercando di unire in questo dizionario in fase di esecuzione prima InitializeComponent () viene chiamato sul mio controllo utente. Sto usando il seguente codice per tentare di fare questo:

public static class StyleLoader
{
    public static void MergeStyle(string xamlUri)
    {
        try
        {
            XDocument xaml = XDocument.Load(xamlUri);
            ResourceDictionary rd = XamlReader.Load(xaml.ToString()) as ResourceDictionary;
            Application.Current.Resources.MergedDictionaries.Add(rd);

        }
        catch (XmlException ex)
        {
            // if the file doesn't exist, we can't add it
        }
    }
}

Il dizionario di risorse dal file optional è bene caricato e si è fusa, tuttavia il mio set originale di stili sembra sempre di essere l'override questo. Se io commento dizionario fusione in XAML e semplicemente li carico in fase di esecuzione in modo che funziona perfettamente:

    StyleLoader.MergeStyle("/MyAssembly;component/Styles.xaml");
    StyleLoader.MergeStyle("BrushReplacements.xaml");

    InitializeComponent();

Il mio problema con questa soluzione è che senza gli stili predefiniti in XAML, non posso aprire il progetto in Blend. Qualcuno ha qualche idea per una soluzione che non mancherà di tenere i miei stili predefiniti noti a Blend, ma mi permette di ignorare facoltativamente in fase di esecuzione con un dizionario risorse caricate dinamicamente? Grazie!

È stato utile?

Soluzione

Ecco una soluzione in cui i colori / pennelli vengono applicati con le associazioni, invece di riferirsi direttamente alle risorse statiche:
http://blogs.msdn.com/corrinab/archive/ 2009/11 / 24 / 9927729.aspx
Seconda parte:
http://blogs.msdn.com/corrinab/archive/ 2009/12/02 / 9931283.aspx

Al momento penso che qualcosa di simile è il modo migliore di trattare con i temi di commutazione in modo dinamico in fase di esecuzione. Ma richiede un sacco di lavoro per il porting di un'applicazione esistente da utilizzare un meccanismo come questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top