替代Silverlight中的MarkupExtension继承

时间:2011-09-12 12:02:57

标签: c# wpf silverlight markup-extensions

我在我的WPF应用程序中使用MarkupExtension继承,我想在Silverlight下移植。

我做了一个“Locale”标记扩展,可以在xaml

中像这样使用
<TextBlock Text="{ui:Locale aRandomId,'My default translation'}" />

实际上,这个MarkupExtension将其应用的属性绑定到字符串“My default translation”,或者,如果找到,则绑定到存储在名为“aRandomId”的数据库中的句子。

这个MarkupExtension允许我动态地改变我的UI的语言环境(markupextension正在注册一个弱事件'LocaleChanged',它会触发与它绑定的每个属性的更新)

由于我们无法从Silverlight中的MarkupExtension继承,我想知道是否有某种机制可以取代它。

感谢。

PS:如果需要,我可以提供此MarkupExtension的来源。

2 个答案:

答案 0 :(得分:0)

出于这个目的,我正在使用Converter和ConverterParam:

MSDN Binding.Converter

这很容易做到,但是当你开始在你的应用程序中使用它们时,它会感觉非常模糊。

<强>更新 也许我过度复杂了你的需求...在我的应用程序中,我有两种使用模式,一种是转换器而另一种是没有。在最简单的情况下,我只想为本地化字典拉一个字符串,它看起来像:

Text="{Binding Localization[my_string_key], Source={StaticResource ViewModelLocator}}"

答案 1 :(得分:0)

我知道这会得到很多传统的答案,但我还想提出一些完全原创的东西,我们尝试(并成功)使用附加属性而不是绑定来更有效地本地化Silverlight:

Link: Localisation of Silverlight projects after completion

我们发现资源和绑定解决方案既繁琐又不灵活,因为它们都需要在项目中设置转换(因此需要在应用程序更改时重新部署应用程序)。

此外,所选择的语言也会发生变化,当它发生变化时,它会同时变为所有字符串。如果语言发生变化,当你可以重新生成当前页面时,为此目的承担绑定的开销似乎很疯狂。

传统上翻译是分批发送的,并由语言管理(使用独特的密钥,翻译笔记等),所以我们发现这也更适合。

我们的解决方案意味着我们在中央服务器数据库中管理本地化,但也可以在应用程序本身内提供本地化编辑器,供翻译人员在使用应用程序时使用。

  • 任意数量语言的中央存储库
  • 通过下载新数据更改语言(大型应用上每种语言最多200kb)
  • 仅下载所需语言并即时更改
  • 支持翻译人员对应用内资源进行编辑(需要额外的UI表单)。