2009-12-17 89 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); 
}