在代码隐藏中从 ResourceDictionary 中检索值
Retrieve a value from ResourceDictionary in code behind
我有一个 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>
你试过了吗
Application.Current.Resources["MyBlue"]
您要引用的 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>
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"];
我会尝试总结所有的解决方案,因为所有以前的解决方案似乎都是整个答案的一部分。
所以主要有两种情况:
情况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"];
我有一个 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>
你试过了吗
Application.Current.Resources["MyBlue"]
您要引用的 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>
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"];
我会尝试总结所有的解决方案,因为所有以前的解决方案似乎都是整个答案的一部分。
所以主要有两种情况:
情况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"];