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

问题描述 投票:0回答:5

在 XAML 中我这样做:

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

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

winrt-xaml
5个回答
59
投票

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

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

祝你好运!


23
投票

在设计时,尝试使用

Resources[key]
解析“系统资源”似乎将无法找到资源并返回
null
。例如,要使用
Style
获取
TextBox
的基数
Resources[typeof(TextBox)]
将返回
null

相反,请使用

TryFindResource(key)
,因为这将首先尝试
Resources[key]
,然后尝试搜索“系统资源”并返回您要查找的内容(根据 MSDN参考源)。

换句话说,试试这个:

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

16
投票

试试这个

Application.Current.Resources["key"]

3
投票

这是一个可以使用的通用帮助器类。走这条路线的优点是,您将能够使用相同的帮助器来获取其他类型的资源(例如画笔或数据模板)

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");

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 一起使用,它是一个结构......所以删除了它。

© www.soinside.com 2019 - 2024. All rights reserved.