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

时间:2016-08-11 14:54:42

标签: xaml winrt-xaml uwp uwp-xaml

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

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

编辑:

到目前为止我尝试了什么:

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

目前唯一的方法似乎是创建一个庞大的类,其中每个翻译/标签必须拥有它自己的属性,或者使用标准的Binding(或从它派生的某个类)。

EDIT_2:

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

1 个答案:

答案 0 :(得分:0)

好的,看起来我找到了一个解决方案,使用了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'消息的错误加下划线。但它编译和工作,所以现在必须足够好。