2009-12-17 86 views
13

我需要通过应用程序菜单支持UI语言更改。 的文本使用资源文件(类似于接近1 here更改WPF中的当前文化后,动态更新UI更新

如果我设置的构造函数调用之前的Thread.CurrentThread.CurrentUICultureInitializeComponent()定位,用户界面被改变,因为它应该。

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

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

回答

10

您可以使用the ResourceDictionary approach以及DynamicResourceMarkupExtension。使用这种方法,您可以替换表示用户选择的语言的资源字典,并且DynamicResourceMarkupExtension将确保新值反映在用户界面中。

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

+1

Drew Marsh,ResourceDictionary链接不再有效。你可以指向.net 4.5中的新链接吗? – bschandramohan 2016-01-11 18:01:07

+0

链接似乎有效。页面标题显示“如何:使用ResourceDictionary管理可本地化的字符串资源”。 – 2016-05-12 14:03:46

2

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

msdn

的的PropertyChanged事件可以指示 通过使用空值 引用(在Visual Basic中为Nothing)或 String.Empty作为属性名称在 PropertyChangedE中更改对象上的所有属性 ventArgs。

+1

感谢。但是,大部分UI只是静态字符串,因此没有任何DataContext。 – Elad 2009-12-22 07:31:55

0

,我试图和行之有效的方法是这种方法,财产的视图模型转让后,致电:

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); 
}