我使用markupextension在WPF应用程序中加载国际化字符串,如下所示:
<Button Content="{Translate MyText}"/>
我的markupextension命名为“TranslateExtension”,它从数据库中搜索键“MyText”的值。它在
中执行此操作ProvideValue(IServiceProvider serviceProvider)
返回正确字符串的方法。一切都很好。
我的问题是,不再调用ProvideValue-Method,并且在语言更改时无法从数据库中提取新字符串。我现在需要一种方法使返回值“动态”,使Button重新加载它的xaml并重新使用markupextension它是否会通过更改语言或其他任何东西时抛出的事件。如何让系统再次调用ProvideValue-Method?我试过喜欢的 InvalidateVisual()InvalidateArrange()InvalidateMeasure()UpdateLayout()...
我希望自己清楚明白。请随时询问有关您认为能够提供想法或解决方案的更多信息。 谢谢
答案 0 :(得分:4)
嗯,解决方案很简单。
ProvideValue只调用一次,但serviceProvider参数还提供了对象实例和属性(PropertyInfo)。这就是您稍后需要更新产品所需的全部内容。
我会在App.cs中创建一个静态事件,比如说CultureChanged; 在ProvideValue方法中获取对象实例和属性并存储它们。附加到CultureChanged事件并在其EventHandler中使用反射设置属性值。就是这样,只要小心记忆泄漏。
有MarkupExtension使用这种方法并允许动态缓存文化: http://www.codeproject.com/KB/WPF/WpfMultiLanguage.aspx
答案 1 :(得分:-1)
我没有给你答案,而是一个建议......
也许您可以考虑使用Binding与IValueConverter结合进行翻译。然后,如果用户界面的语言发生变化,您可以简单地递归所有绑定并刷新它们。
就像我说的那样,只是一个想法。