【问题标题】:WPF: Dynamic MarkupExtension- ReRendering/Updating of valueWPF:动态标记扩展-重新渲染/更新值
【发布时间】:2009-06-14 14:21:58
【问题描述】:

我正在使用标记扩展在 WPF 应用程序中加载国际化字符串,如下所示:

<Button Content="{Translate MyText}"/>

我的标记扩展名为“TranslateExtension”,它从数据库中搜索键“MyText”的值。它在

ProvideValue(IServiceProvider serviceProvider)

返回正确字符串的方法。一切正常。

我的问题是,ProvideValue-Method 不再被调用,并且当语言改变时,没有办法从数据库中提取一个新的字符串。我现在需要一种方法来使返回值“动态”,使按钮重新加载它的 xaml 并重新使用标记扩展,无论它是通过更改语言时抛出的事件还是其他什么。如何让系统再次调用 ProvideValue-Method?我尝试过 InvalidateVisual() InvalidateArrange() InvalidateMeasure() UpdateLayout()...

我希望我说清楚了。请随时询问您认为您能够提供想法或解决方案的更多信息。 谢谢

【问题讨论】:

    标签: wpf xaml markup dynamicresource


    【解决方案1】:

    嗯,解决方案很简单。

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

    我会在 App.cs 中创建一个静态事件,比如 CultureChanged。 在ProvideValue中,从ServiceProvider获取IProvideValueTarget服务,从中可以获取对象实例和属性。附加到 CultureChanged 事件并在其 EventHandler 中使用反射设置属性值。请注意内存泄漏。

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

    【讨论】:

      【解决方案2】:

      我没有给你的答案,而是一个建议......

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

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

      【讨论】:

      • 你好马克,谢谢你的建议。我会看看使用绑定,但在我的情况下它们可能不起作用。整个事情有点困难,我简化了我需要的东西。问题是,我正在为每种表格分别选择语言,如果表格没有选择的语言,它将依赖标准语言(也可以更改)。我发现,标记扩展在 xaml 被渲染后暴露(除非在某处仍有引用)。我目前正在尝试气泡和隧道事件并在表单上注册一个处理程序。
      • 但我必须评估性能和内存问题。无论如何,似乎附近没有“真正重新加载表单”的方法。
      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 2020-12-11
      • 2021-09-02
      • 2021-01-27
      • 2018-06-05
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多