WPF:动态MarkupExtension- ReRendering /更新值

6 wpf markup xaml dynamicresource

我使用markupextension在WPF应用程序中加载国际化字符串,如下所示:

<Button Content="{Translate MyText}"/>
Run Code Online (Sandbox Code Playgroud)

我的markupextension命名为"TranslateExtension",它从数据库中搜索键"MyText"的值.它是这样做的

ProvideValue(IServiceProvider serviceProvider)
Run Code Online (Sandbox Code Playgroud)

返回正确字符串的方法.一切都很好.

我的问题是,不再调用ProvideValue-Method,并且在语言更改时无法从数据库中提取新字符串.我现在需要一种方法使返回值"动态",使Button重新加载它的xaml并重新使用markupextension它是否会通过更改语言或其他任何东西时抛出的事件.如何让系统再次调用ProvideValue-Method?我试过像InvalidateVisual()InvalidateArrange()InvalidateMeasure()UpdateLayout()...

我希望我清楚自己.请随时询问有关您认为能够提供想法或解决方案的更多信息.谢谢

Lie*_*ero 6

嗯,解决方案是很简单的想法。

ProvideValue 仅被调用一次,但 serviceProvider 参数还为您提供对象实例和属性 (PropertyInfo)。这就是您稍后更新属性所需的全部内容。

我会在 App.cs 中创建一个静态事件,比如说 CultureChanged;在 ProvideValue 方法中获取对象实例和属性并存储它们。附加到 CultureChanged 事件并在其 EventHandler 中使用反射设置属性值。就是这样,只是要小心内存泄漏。

有 MarkupExtension 使用这种方法并允许动态缓存文化:http : //www.codeproject.com/KB/WPF/WpfMultiLanguage.aspx


Mar*_*ark 0

我没有给你答案,只是给你一个建议……

也许您可以考虑使用 Binding 与 IValueConverter 相结合来进行翻译。然后,如果用户界面的语言发生变化,您可以简单地递归所有绑定并刷新它们。

就像我说的,只是一个想法。