Uwp:不使用资源文件的自定义本地化



我正在开发一个UWP应用程序,它将被侧加载,并从一个WebAPI获得它的大部分配置。我希望能够在XAML和代码中使用翻译后的标签,因为我看到"UWP方式"是使用资源文件,但我不想将字符串存储在项目本身,我希望它们从WebAPI加载,然后使用缓存的键值字典。

显然在代码中获得字符串没有问题,问题是XAML -在WPF中使用自定义MarkupExtension非常简单,但是因为我们在UWP中没有MakrupExtensions,是否有一个干净的方法来做到这一点?

编辑:

我试过了:

  • 为所有控件创建一个基类,该基类带有一个索引器来获取翻译-不工作,因为x:Bind不支持基于字符串的索引器
  • 尝试使用自定义动态对象-不工作,因为x:Bind不支持动态对象
  • 试图将自己的类作为资源并从中访问属性-再次不起作用

目前唯一的方法似乎是创建一个巨大的类,每个翻译/标签都必须有自己的属性,或者使用标准绑定(或从它派生的一些类)。

EDIT_2:

忘了,另一个用例是在带有模板的xaml资源中使用它,而不仅仅是控件和页面。

看起来我找到了一个解决方案,通过使用CustomResource功能,如下所述:

https://msdn.microsoft.com/en-us/windows/uwp/xaml-platform/customresource-markup-extension

如果我实现这样一个类:

public class MyResourceLoader : CustomXamlResourceLoader
{
    protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType)
    {
        return "Translation for key:" + resourceId;
    }
}

并在App.xaml.cs构造函数中初始化它:

public App()
{
    CustomXamlResourceLoader.Current = new MyResourceLoader();
    this.InitializeComponent();
    this.Suspending += OnSuspending;
}

然后我可以通过以下方式从XAML访问它:

<TextBlock Text="{CustomResource myTranslationKey}"></TextBlock>

它成功了。

然而

在VisualStudio的XAML设计器不理解CustomResource标记扩展和强调它作为一个错误与Cannot resolve symbol 'CustomResource'消息。但是它可以编译和工作,所以现在已经足够好了。

最新更新