【问题标题】:Using a global ResourceLoader in UWP/Windows Store App在 UWP/Windows Store App 中使用全局 ResourceLoader
【发布时间】:2016-03-27 10:33:45
【问题描述】:

我使用 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 实例,而且很容易访问。有什么反对这样做的吗?它似乎在我的应用程序中工作,但我不想在这里错过任何东西。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我不知道它是否有帮助,但这是我用于从代码中的 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");
      

      【讨论】:

      • 你使用异步方法有什么原因吗?我不认为获取资源字符串需要...
      • 只是出于偏好,所以其余代码(通常是 async/await)是一致的。
      猜你喜欢
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2014-06-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多