在我的App.XAML中,我有这个:
<Application xmlns:converters="clr-namespace:Japanese" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Japanese.App">
<Application.Resources>
<Color x:Key="TextColor1">#123456</Color>
我可以这样在XAML中访问该值:
<Style TargetType="Label">
<Setter Property="TextColor" Value="{StaticResource TextColor1}" />
</Style>
但是还有一种方法可以在后端C#中访问它
vm.C1BtnLabelTextColor = phrase.C1 == true ? Color.FromHex("#123456") : Color.FromHex("#0000FF");
例如,在这里我要替换:
Color.FromHex("#123456")
具有StaticResource的值
答案 0 :(得分:3)
您可以这样访问:
Application.Current.Resources["TextColor1"];
答案 1 :(得分:2)
ResourceDictionary是存储资源的存储库 Xamarin.Forms应用程序。存储在服务器中的典型资源 ResourceDictionary包括样式,控件模板,数据模板, 颜色和转换器。
在XAML中,可以将存储在ResourceDictionary中的资源设置为 通过使用StaticResource标记检索并应用于元素 延期。在C#中,资源也可以在 ResourceDictionary,然后通过使用检索并将其应用于元素 基于字符串的索引器。但是,使用 C#中的ResourceDictionary,因为共享对象可以简单地存储为 字段或属性,无需先直接访问 从字典中检索它们。
简而言之:ResourceDictionary
是Dictionary
。
要从Dictionary
读取值,您必须提供Key
。在您的情况下,Key
是“ TextColor1”。因此,使用C#可以从Application.Resources
中读取值:
var txtColor1 = (Color) Application.Current.Resources["TextColor1"];
请注意,您必须将返回值强制转换为所需的类型,这是因为Dictionary
是“泛型”的。
如果必须在项目中重复使用它,也可以创建一个Extension Method
。
答案 2 :(得分:0)
此处提出的解决方案 (Application.Current.Resources["TextColor1"];
) 仅在您没有 ResourceDictionary.MergedDictionaries
时才有效,否则,您需要以下方法:
// helper method
private object GetResourceValue(string keyName)
{
// Search all dictionaries
if (Xamarin.Forms.Application.Current.Resources.TryGetValue(keyName, out var retVal)) {}
return retVal;
}
例如如何使用:
ButtonColor = (Color) GetResourceValue("Primary");
此方法将确保迭代所有合并的资源以找到您当前的资源。
参考:https://forums.xamarin.com/discussion/146001/how-to-get-a-rsource-from-an-mergeddictionary-in-c-code