在UWP / Windows应用商店应用中使用全局ResourceLoader

时间:2016-03-27 10:33:46

标签: windows-store-apps win-universal-app

我使用resw文件在我的应用程序中存储文字字符串,然后使用

访问它们
(new Windows.ApplicationModel.Resources.ResourceLoader()).GetString("resourceName");

我发现这有点麻烦,并希望有一个全局资源加载器,例如在静态类中:

public static class ResourceLoader
{
    private static Windows.ApplicationModel.Resources.ResourceLoader loader = new Windows.ApplicationModel.Resources.ResourceLoader();

    public static string Get(string name)
    {
        return loader.GetString(name);
    }
}

这样我只有一个ResourceLoader实例,并且很容易访问。是否有任何反对这样做的事情?它似乎适用于我的应用程序,但我不想错过这里的任何内容。

2 个答案:

答案 0 :(得分:1)

使用全局ResourceLoader没有记录的缺点。 虽然你应该使用静态方法GetForViewIndependentUse()而不是构造函数来获取实例; 此方法为您提供了一个不依赖于任何特定上下文的ResourceLoader实例,因此您可以从代码中的任何位置检索应用程序中的资源。

答案 1 :(得分:1)

我不知道它是否有帮助,但这是我用来从代码中的ResW加载字符串的类:

using System;
using System.Threading.Tasks;
using Windows.ApplicationModel.Resources;

namespace ProjectName.Services
{
    public sealed class ResourceService : ObservableObject
    {
        private ResourceService() {}

        public static Task<ResourceService> CreateServiceAsync ()
        {
            return Task.FromResult(new ResourceService());
        }

        public Task<string> GetResourceStringAsync (string stringname)
        {
            try
            {
                var resourceloader = ResourceLoader.GetForCurrentView();
                return Task.FromResult(resourceloader.GetString(stringname));
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        public Task<string> GetResourceStringAsync (string resource, string stringname)
        {
            try
            {
                var resourceloader = ResourceLoader.GetForCurrentView(resource);
                return Task.FromResult(resourceloader.GetString(stringname));
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }
}

我在OnLaunched事件的App.xaml.cs中初始化它:

this.ResourceService = await ResourceService.CreateServiceAsync()

然后用:

消耗它
var stringtoget = await App.ResourceService.GetResourceStringAsync("resourcename", "stringkeyname");