在代码后台从ResourceDictionary中检索值

5

我有一个用于Windows 10的通用应用程序,其中包含一些用于样式等的资源词典。

在一个这样的资源词典中,我有一个颜色叫做MyBlue,我希望通过后台代码访问它。如何实现?

我已经尝试了this.Resources["MyBlue"],但由于MyBlue是在独立的资源词典中定义而不是直接在页面资源中定义,因此它不存在于此集合中。

这是我的app.xaml:

<Application.Resources>

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles/PodStyles.xaml"/>
            <ResourceDictionary Source="Styles/ButtonStyles.xaml"/>
            <ResourceDictionary Source="Styles/OfferStyles.xaml"/>
            <ResourceDictionary Source="Styles/MyStyles.xaml"/>

            <ResourceDictionary>
                <!--Global View Model Locator-->
                <vm:ViewModelLocator x:Key="Locator"
                                     d:IsDataSource="True"/>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</Application.Resources>
4个回答

6

你试过吗?

Application.Current.Resources["MyBlue"]

该资源集合中没有任何项。 - earthling

4

可以通过Application.Current.Resources.MergedDictionaries来获得MergedDictionaries。

我能够通过Uri获取适当的ResourceDictionary,然后通过键名访问其中的项:

var mergedDict = Application.Current.Resources.MergedDictionaries.Where(md => md.Source.AbsoluteUri == "ms-resource:///Files/Styles/MyStyles.xaml").FirstOrDefault();
newColor = (Windows.UI.Color)mergedDict["MyBlue"];

你能分享一下你的app.xaml吗?这应该是不必要的。 - moswald
哦...:confused: 我真的不知道。看起来是正确的,你应该能够通过查看应用程序的资源来找到它。 - moswald

3

我会尽力总结所有解决方案,因为之前的解决方案似乎只有全部答案的一部分。

所以有两种主要情况:

情况A. 您的值在App.xaml的主ResourceDictionary

其中App.xaml是:

...
<Application.Resources>
    <ResourceDictionary>
        <Color x:Key="backgroundColor">LightBlue</Color>
    </ResourceDictionary>
</Application.Resources>
...

如果是这样,使用以下方法读取您的值:
Application.Current.Resources["backgroundColor"]

案例 B. 您的值在一个外部的 ResourceDictionary 中,并且已合并到您的 App.xaml 中。

其中 App.xaml 是:

...
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles/Constants.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
...

其中Constants.xaml是:

<?xml version="1.0" encoding="utf-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    <Color x:Key="backgroundColor">LightBlue</Color>
</ResourceDictionary>

在这种情况下使用 @earthling 的解决方案:
var mergedDict = Application.Current.Resources.MergedDictionaries.Where(md => md.Source.OriginalString.Equals("Styles/Constants.xaml")).FirstOrDefault();
var color = (Color)mergedDict["pressedColor"];

1
这应该是被接受的答案。但要小心:最好使用OriginalString.Contains("Contants.xaml"),因为现在他们在.xaml后面添加了程序集名称。 - Nk54

1
你想引用的ResourceDictionary必须以某种方式被引入应用程序资源中。如果它足够常见,可以将其合并到Application的资源中(这会稍微影响应用程序的初始化),或者将其合并到Page的资源中(这会稍微影响第一页的初始化)。
您可以使用以下语法包含外部ResourceDictionaries:
<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="path/to/resource.xaml" />
        </ResourceDictionary>

        <... your other resources for this page go here .../>
    </ResourceDictionary>
</Page.Resources>

我正在将它合并到我的应用程序资源中。我能够在XAML中引用这些资源,但无法在代码后台中引用。 - earthling
然后 (Color)Application.Current.Resources["MyBlue"] 就可以了。 - moswald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接