我正在开发一个UWP应用程序,它将被侧加载,并从一个WebAPI获得它的大部分配置。我希望能够在XAML和代码中使用翻译后的标签,因为我看到"UWP方式"是使用资源文件,但我不想将字符串存储在项目本身,我希望它们从WebAPI加载,然后使用缓存的键值字典。
显然在代码中获得字符串没有问题,问题是XAML -在WPF中使用自定义MarkupExtension非常简单,但是因为我们在UWP中没有MakrupExtensions,是否有一个干净的方法来做到这一点?
编辑:我试过了:
- 为所有控件创建一个基类,该基类带有一个索引器来获取翻译-不工作,因为x:Bind不支持基于字符串的索引器
- 尝试使用自定义动态对象-不工作,因为x:Bind不支持动态对象
- 试图将自己的类作为资源并从中访问属性-再次不起作用
目前唯一的方法似乎是创建一个巨大的类,每个翻译/标签都必须有自己的属性,或者使用标准绑定(或从它派生的一些类)。
EDIT_2:
忘了,另一个用例是在带有模板的xaml资源中使用它,而不仅仅是控件和页面。
看起来我找到了一个解决方案,通过使用CustomResource
功能,如下所述:
如果我实现这样一个类:
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'
消息。但是它可以编译和工作,所以现在已经足够好了。