有什么方法可以访问C#代码中的静态资源?

时间:2018-10-06 08:02:36

标签: xamarin xamarin.forms

在我的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的值

3 个答案:

答案 0 :(得分:3)

您可以这样访问:

Application.Current.Resources["TextColor1"];

答案 1 :(得分:2)

  

ResourceDictionary是存储资源的存储库   Xamarin.Forms应用程序。存储在服务器中的典型资源   ResourceDictionary包括样式,控件模板,数据模板,   颜色和转换器。

     

在XAML中,可以将存储在ResourceDictionary中的资源设置为   通过使用StaticResource标记检索并应用于元素   延期。在C#中,资源也可以在   ResourceDictionary,然后通过使用检索并将其应用于元素   基于字符串的索引器。但是,使用   C#中的ResourceDictionary,因为共享对象可以简单地存储为   字段或属性,无需先直接访问   从字典中检索它们。

简而言之:ResourceDictionaryDictionary
要从Dictionary读取值,您必须提供Key。在您的情况下,Key是“ TextColor1”。因此,使用C#可以从Application.Resources中读取值:

var txtColor1 = (Color) Application.Current.Resources["TextColor1"];

请注意,您必须将返回值强制转换为所需的类型,这是因为Dictionary是“泛型”的。

如果必须在项目中重复使用它,也可以创建一个Extension Method

来源:Official documentation

答案 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