Domanda

È possibile leggere i ResourceDictionaries di WPF da WinForms? Se sì, come?

È stato utile?

Soluzione

Quando aggiungi dizionari di risorse a un progetto WPF, l'azione di compilazione viene automaticamente impostata su Pagina. Ciò significa che il compilatore genera un flusso BAML e lo aggiunge alle risorse dell'assembly.

Poiché WPF ha la funzionalità integrata per leggere uno stream BAML ma la sua API non è pubblica, dobbiamo scrivere una piccola classe di supporto che acceda al metodo interno tramite la riflessione.

public static class BamlReader
{
    public static object Load(Stream stream)
    {
        ParserContext pc = new ParserContext();
        MethodInfo loadBamlMethod = typeof(XamlReader).GetMethod("LoadBaml", 
            BindingFlags.NonPublic | BindingFlags.Static)
        return loadBamlMethod.Invoke(null, new object[] { stream, pc, null, false });
    }
}

// Usage:
StreamResourceInfo sri = System.Windows.Application.GetResourceStream(
    new Uri("/MyAssemblyName;component/MyResourceDict.xaml", UriKind.Relative));
    ResourceDictionary resources = (ResourceDictionary)BamlReader.Load(sri.Stream);

Fonte: Come leggere i dizionari di risorse WPF da WinForms

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