繁体   English   中英

从ClassLibrary中的应用程序合并DictionaryResource

[英]Merge DictionaryResource from Application in a ClassLibrary

我有一个Windows Phone 8.1解决方案,其中包含一个标准应用程序项目和一个类库项目。 我的想法是,我可以以某种方式将StaticResources分解为ClassLibrary,以便它可以覆盖现有的类。 我举一个例子:在我的ClassLibrary中,我有一个ClassLibraryDictionary.xaml其中包含以下代码:

<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>

想法是,在MainApplication中,我可以拥有一个具有相同StaticResource键的Dictionary.xaml,并将其传递给ClassLibrary,以便它可以覆盖默认属性,例如:

<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>

并将其传递给代码:

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

这里的问题是我似乎无法在ClassLibrary中使用ResourceDictionary实例,而且我甚至不确定这是否是实现此目的的最佳方法。
那么,我该如何解决呢?

我发现了如何做到这一点,实际上很简单。 我使用的路径不是正确的路径,因此,如果要在App.xaml (在MainApp中)中进行操作,那么总结一下XAML中的解决方案是这样的:

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

如果要直接在ClassLibrary中的代码中进行设置,可以执行以下操作:
MainApp.xaml.cs

myClassLibrary.MergeAllDictionaries(App.Current.Resources);

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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