时间:2015-11-02 21:02:17

标签: xaml windows-10 resourcedictionary uwp

我有一个Windows 10通用应用程序,其中包含一些用于样式等的资源词典。 在一个这样的资源字典中,我有一个颜色MyBlue,我想通过后面的代码访问。这是如何实现的?

我已经尝试了this.Resources["MyBlue"],但由于MyBlue是在单独的资源字典中定义的,而不是直接在页面资源中定义,因此该集合中不存在。{/ p>

这是我的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 个答案:

答案 0 :(得分:5)

你试过吗

Application.Current.Resources["MyBlue"]

答案 1 :(得分:4)

MergedDictionaries可通过Application.Current.Resources.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"];

答案 2 :(得分: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>

答案 3 :(得分:1)

由于所有以前的解决方案似乎都包含整个答案,因此我将尝试总结所有解决方案。

所以主要有两种情况:

案例A。您的值在ResourceDictionary的主App.xaml

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"];