.net 在WPF中更改当前区域性后,动态强制UI更新

.net 在WPF中更改当前区域性后,动态强制UI更新,.net,wpf,internationalization,.net,Wpf,Internationalization,我需要通过应用程序菜单支持UI语言更改。 使用资源文件对文本进行本地化(类似于方法1) 如果我在ctor调用InitializeComponent()之前设置线程.CurrentThread.CurrentUICulture,UI将按其应该的方式更改 但是,如果在应用程序正常运行期间更改了CurrentUICulture,则不会更新控件(即,无论当前区域性如何,文本保持不变) 是否有方法强制控件根据CurrentUICulture刷新?假设菜单的DataContext是一个实现INotifyPr

我需要通过应用程序菜单支持UI语言更改。 使用资源文件对文本进行本地化(类似于方法1)

如果我在ctor调用
InitializeComponent()
之前设置
线程.CurrentThread.CurrentUICulture
,UI将按其应该的方式更改

但是,如果在应用程序正常运行期间更改了
CurrentUICulture
,则不会更新控件(即,无论当前区域性如何,文本保持不变)


是否有方法强制控件根据
CurrentUICulture
刷新?

假设菜单的DataContext是一个实现INotifyPropertyChanged的对象,您可以通过在PropertyChanged事件中指定null(nothing)来刷新所有控件

发件人:

PropertyChanged事件可以指示 对象上的所有属性都具有 通过使用null或 参考(Visual Basic中无任何内容)或 字符串。中的属性名称为空 属性ChangedEventArgs

您可以与
DynamicResourceMarkupExtension一起使用。使用这种方法,您可以调出表示用户所选语言的资源字典,而
DynamicResourceMarkupExtension
将确保新值反映在UI中


此外,如果您愿意冒险进入自定义解决方案领域,还有中提供的
LocalizeMarkupExtension

我尝试过并且效果很好的一种方法是在ViewModel中指定属性后调用此方法:

private void AllowUiToUpdate()
{
    var frame = new DispatcherFrame();

    var dispatcherOperationCallback = new DispatcherOperationCallback(delegate
        {
            frame.Continue = false;
            return null;
        });

    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, dispatcherOperationCallback, null);

    Dispatcher.PushFrame(frame);
}

谢谢但是,大多数UI只是静态字符串,因此没有任何DataContext。Drew Marsh,ResourceDictionary链接不再有效。你能指出.net 4.5中的新链接吗?该链接似乎有效。页面标题是“如何:使用ResourceDictionary来管理可本地化的字符串资源”。不知道为什么会这样做。。。你能再详细说明一下吗?