我有一個多語言的silverlight應用程序,其中資源存儲在resx文件中用於不同語言,並綁定到xaml中按鈕和標籤的Content Properties。動態更改UI語言
當在silverlight頁面的構造函數中設置線程的UI文化時,每件事情都可以正常工作,但是根據用戶的選擇(通過組合框選擇) 更改界面不會更改。我需要頁面重新繪製控件並根據新線程的UI文化重新綁定到資源文件。
我有一個多語言的silverlight應用程序,其中資源存儲在resx文件中用於不同語言,並綁定到xaml中按鈕和標籤的Content Properties。動態更改UI語言
當在silverlight頁面的構造函數中設置線程的UI文化時,每件事情都可以正常工作,但是根據用戶的選擇(通過組合框選擇) 更改界面不會更改。我需要頁面重新繪製控件並根據新線程的UI文化重新綁定到資源文件。
我不確定你用什麼機制將你的視圖綁定到你的本地化存儲庫,但我猜測問題在於通知。
視圖只會在獲取通知事件時更新綁定中的數據。最有可能的情況是,當文化發生變化時,與您綁定的本地化數據的對象不會發送通知。
您可能會考慮將INotifyPropertyChanged添加到包含您的本地化字符串的對象。然後,向該類添加一個名爲「NotifyThatEverythingChanged」的方法。在該方法中,只需發送屬性string.Empty已更改,即告知UI更新數據上下文中的所有內容。
在我的情況,我有RESX爲我自動生成的對象稱爲MyUIStrings。它有一堆靜態字符串。我從該類派生,並添加功能來通知所有內容已更改。該UI將採取相應的行動:
public class NotifyableUIStrings : MyUIStrings, INotifyPropertyChanged
{
public void NotifyThatEverythingChanged()
{
OnPropertyChanged(string.Empty);
}
protected void OnPropertyChanged(string propertyName)
{
var handlers = PropertyChanged;
if(handlers != null)
handlers(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
能否請您詳細說明如何在應用程序中使用這個類。我試圖做同樣的事情,綁定不起作用,我的綁定中的內容是空的。如果我註冊了「MyUIStrings」而不是通知版本,它工作正常。這是用於Silverlight 4. – SondreB 2010-08-14 14:37:01
實現NotifyThatEverythingChanged的更簡單的方法是僅執行OnPropertyChanged(null)。請參閱這裏的備註部分:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx – ArildF 2010-08-14 14:55:29
@ArildF:是的。那就對了。當時不知道。 String.Empty的作品也太:) – 2010-08-18 11:46:57