如何在代码隐藏中引用StaticResource?

时间:2015-07-01 16:04:56

标签: winrt-xaml

在XAML中,我这样做:

<Button Style="{StaticResource NavigationBackButtonNormalStyle}" />

如何在代码隐藏中执行相同的操作?

5 个答案:

答案 0 :(得分:18)

页面级Resources对象能够查找本地,应用程序级别,静态和主题资源。这意味着您只需执行此操作:

foo2.Style = this.Resources["NavigationBackButtonNormalStyle"] as Style;

祝你好运!

答案 1 :(得分:7)

在设计期间,似乎试图解决一个&#34;系统资源&#34;使用Resources[key]将无法找到资源,并将返回null。例如,要使用Style获取TextBox的基数Resources[typeof(TextBox)],将返回null

相反,请使用TryFindResource(key),因为这将首先尝试Resources[key]然后尝试搜索&#34;系统资源&#34;并将返回您要查找的内容(根据MSDNReference Source)。

换句话说,请尝试这样做:

var style = Application.Current.TryFindResource(key) as Style;

答案 2 :(得分:1)

这是一个可以使用的通用助手类。走这条路的好处是,你可以使用同一个帮助器来获取其他类型的资源(例如Brushes或DataTemplate)

public static class Helper
{
    public static T Get<T>(string resourceName) where T : class
    {
        return Application.Current.TryFindResource(resourceName) as T;
    }
}

以及如何在代码中使用:

yourButton.Style = Helper.Get<Style>("NavigationBackButtonNormalStyle");

如果你想获得刷子资源,你可以使用

ItemTemplate = Helper.Get<DataTemplate>("MyDataTemplate");

答案 3 :(得分:1)

尝试一下

Application.Current.Resources["key"]

答案 4 :(得分:0)

如果您使用的是ViewModel,将无法使用上面的答案。

要及时更新Eternal21的答案,您可以这样:

public static T Get<T>(string resourceName) 
        {   
            try{
                var success = Application.Current.Resources.TryGetValue(resourceName, out var outValue);
                if(success && outValue is T)
                {
                    return (T)outValue;
                }
                else
                {
                    return default(T);
                }
            }
            catch
            {
                return default(T);
            }
        }

请注意,此处缺少where子句。我不想将其限制为类,因此也可以将其与Color一起使用,后者是一种结构...因此将其删除。