WPF:动态标记扩展-重新提交/更新值

WPF:动态标记扩展-重新提交/更新值,wpf,xaml,markup,dynamicresource,Wpf,Xaml,Markup,Dynamicresource,我使用markupextension在WPF应用程序中加载国际化字符串,如下所示: <Button Content="{Translate MyText}"/> 方法返回正确的字符串。一切正常 我的问题是,ProvideValue方法不再被调用,而且当语言发生变化时,也无法从数据库中提取新字符串。我现在需要一种方法使返回值“动态”,使按钮重新加载它的xaml并重新使用markupextension,无论它是通过更改语言时抛出的事件还是其他方式。如何使系统再次调用ProvideVal

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

<Button Content="{Translate MyText}"/>
方法返回正确的字符串。一切正常

我的问题是,ProvideValue方法不再被调用,而且当语言发生变化时,也无法从数据库中提取新字符串。我现在需要一种方法使返回值“动态”,使按钮重新加载它的xaml并重新使用markupextension,无论它是通过更改语言时抛出的事件还是其他方式。如何使系统再次调用ProvideValue方法?我试过类似的方法 InvalidateVisual()InvalidateArrange()InvalidateMeasure()UpdateLayout()

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

我没有答案,只是有个建议

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


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

好吧,解决方案很简单

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

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

MarkupExtension使用这种方法,允许动态缓存区域性:

你好,马克,谢谢你的建议。我将研究如何使用绑定,但在我的情况下它们可能不起作用。整个事情有点困难,我简化了我需要的东西。问题是,我正在为每个表单分别选择语言,如果表单没有选择的语言,它将依赖标准语言(也可以更改)。我发现,标记扩展是在xaml呈现之后公开的(除非在某个地方仍然有引用)。我目前正在尝试bubble和tunnel事件,并在表单上注册一个处理程序。但我必须评估性能和内存问题。无论如何,似乎附近没有“真正重新加载表单”的方法。
ProvideValue(IServiceProvider serviceProvider)