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