简体   繁体   中英

Merge DictionaryResource from Application in a ClassLibrary

I have a Windows Phone 8.1 solution that has a Standard Application Project and a Class Library Project. The idea is that I can, somehow, StaticResources down do the ClassLibrary so it can override the existing ones. I'll give you an example: In my ClassLibrary I have a ClassLibraryDictionary.xaml with the following code:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:ClassLibraryTest">

    <SolidColorBrush x:Key="MyButtonColor" Color="#FF0000FF" />

</ResourceDictionary>

And the idea is that in my MainApplication I could have a Dictionary.xaml with the same StaticResource Key, and pass it to my ClassLibrary so it can override the default property, something like:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MainApplicationTest">

    <SolidColorBrush x:Key="MyButtonColor" Color="#00FF00FF" />

</ResourceDictionary>

And passing it in code:

var mainAppDictionary = new ResourceDictionary();
mainAppDictionary.Source = new Uri("/using:MainApplicationTest;component/MainApplicationDictionary.xaml", UriKind.RelativeOrAbsolute);
classLibraryTest.SetResourceDictionary(mainAppDictionary);

The problem here is that I can't seem to use the ResourceDictionary instance in my ClassLibrary, and I'm not even sure this is the best way to do this.
So, how could I solve this?

I found out how to this and it is actually simple. The path I was using was not the correct one, so to sum it all up, the solution in XAML, if you were to do it in the App.xaml (in the MainApp) looks like this:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ms-appx://Common/yourclasslibraryname/ClassLibraryDictionary.xaml"></ResourceDictionary>
            <ResourceDictionary Source="/Dictionary1.xaml"></ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

If you want to set it in code directly in the ClassLibrary you can do something like this:
In the MainApp.xaml.cs

myClassLibrary.MergeAllDictionaries(App.Current.Resources);

And in the ClassLibrary :

public void MergeAllDictionaries(ResourceDictionary appDictionary) {
    // First copy all keys from MainApp to a new Dictionary
    ResourceDictionary mainDictionary = new ResourceDictionary();
    foreach(var keys in appDictionary.MergedDictionaries) {
        foreach(var keys1 in keys) {
            mainDictionary.Add(keys1.Key, keys1.Value);
        }
    }

    // Then clear all
    appDictionary.Clear();

    // Get the ClassLibrary dictionary
    ResourceDictionary classLibraryDictionary = new ResourceDictionary();
    classLibraryDictionary.Source = new Uri("ms-appx://Common/yourclasslibraryname/ClassLibraryDictionary.xaml", UriKind.RelativeOrAbsolute);

    // First add the ClassLibrary keys and values
    appDictionary.MergedDictionaries.Add(classLibraryDictionary);
    // Then add the old values, so that they overwrite the ClassLibrary ones
    appDictionary.MergedDictionaries.Add(mainDictionary);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM