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

How do I reference a StaticResource in code-behind?

在XAML中我是这样做的:

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

如何在代码隐藏中做同样的事情?

页面级资源对象具有查找本地、应用级、静态和主题资源的能力。这意味着您只需这样做:

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

祝你好运!

在设计时,似乎尝试使用 Resources[key] 解析 "system resource" 将无法找到资源,并且会 return null。例如,要使用 Resources[typeof(TextBox)] 获取 TextBox 的基数 Style 将 return null.

相反,请使用 TryFindResource(key),因为这将首先尝试 Resources[key],然后将尝试搜索 "system resources" 并 return 您要查找的内容(根据 MSDN and Reference Source).

换句话说,试试这个:

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

这是一个可以使用的通用助手 class。走这条路的好处是,您将能够使用相同的助手来获取其他类型的资源(例如画笔或 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");

试试这个

Application.Current.Resources["key"]

如果您在 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 一起使用,这是一个结构...所以将其删除。