[英]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.