在WPF中更改当前文化后,动态强制UI更新

时间:2009-12-17 16:32:31

标签: .net wpf internationalization

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

如果我在ctor调用Thread.CurrentThread.CurrentUICulture之前设置InitializeComponent(),则UI会按原样更改。

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

有没有办法根据CurrentUICulture强制控件刷新?

3 个答案:

答案 0 :(得分:10)

您可以将the ResourceDictionary approachDynamicResourceMarkupExtension一起使用。使用此方法,您可以换出表示用户所选语言的资源字典,DynamicResourceMarkupExtension将确保新值反映在UI中。

此外,如果您愿意冒险进入自定义解决方案领域,this WPF tutorial中会提供LocalizeMarkupExtension

答案 1 :(得分:2)

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

来自msdn

  

PropertyChanged事件可以指示   对象上的所有属性都有   通过使用null来改变   引用(在Visual Basic中没有任何内容)或   String.Empty作为属性名称   PropertyChangedEventArgs。

答案 2 :(得分:-1)

我尝试并运行良好的方法是在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);
}