0

ここで、UI言語について少し混乱しています。言語が変更された場合はどうなりますか?フォルダ全体が変更されますか、それともカルチャがロードされますか?実際に何が起こっているのかわかりません。

  Properties.Strings.MainWindow_Language_Selection_English_Label="English"
  Properties.Strings.MainWindow_Language_Selection_Gujarati_Label="ગુજરાતી"

何が起こっているのか説明してください。

  private void LanguageSelection_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ComboBoxItem item = LanguageSelection.SelectedItem as ComboBoxItem;
        if (item.Content.ToString() == Properties.Strings.MainWindow_Language_Selection_English_Label)
        {
            CultureManager.UICulture = new System.Globalization.CultureInfo("en");
        }
        else if (item.Content.ToString() == Properties.Strings.MainWindow_Language_Selection_Gujarati_Label)
        {
            CultureManager.UICulture = new System.Globalization.CultureInfo("gu");
        }

        Settings.Default["UILanguage"] = CultureManager.UICulture.Name;
        Settings.Default.Save();
    }
4

1 に答える 1

0

一般に、アプリケーションスレッドでのカルチャの設定は、表示される次のフォームで有効になるため、この機能を実現するには、メインスレッドのカルチャを設定してから、アプリケーションのメインウィンドウを表示するログイン/言語選択ウィンドウが必要になる可能性があります。

言語の選択をすぐに有効にするために(WPFでは簡単に)これを回避するためのいくつかの試みがありましたが、これは箱から出してすぐに機能する方法です。

ただし、WPFでは、UI要素をリソースに直接バインドしている場合は、リソースプロパティでプロパティ変更イベントを発生させることでUIを更新できます。これを実現する最も簡単な方法(.resxファイル用の新しいコードジェネレーターを作成する以外)は、次のようなモデルクラスでリソースをラップすることです。

public class StringRes : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate {};

    public string Login
    {
        get { return Properties.Strings.Login; }
    }

    public string Password
    {
        get { return Properties.Strings.Password; }
    }

    public void NotifyLanguageChanged()
    {
        PropertyChanged(this, new PropertyChangedEventArgs("Login"));
        PropertyChanged(this, new PropertyChangedEventArgs("Password"));
    }
}

public class MainWindow
{
    private StringRes _resources;

    private void LanguageSelection_SelectionChanged()
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = GetCurrentCulture();
        _resources.NotifyLanguageChanged();
    }
}

UI要素をStringResクラスのインスタンスにバインドしている場合、モデルで通知変更イベントを発生させると、UI要素が更新されます。

于 2012-05-20T01:41:41.093 に答える