2

私はよく知られているLocBamlアプローチを使用して文化を変えています。

ここでうまく動作します:

public App()
{ 
    // Test code 
    bool override_current_ui_language = true;
    string locale = "es-ES";
    if (override_current_ui_language)
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(locale);
        Thread.CurrentThread.CurrentCulture = new CultureInfo(locale);
    }    
} 

しかし、WPF ウィンドウ クラス コントローラーで同じものを使用すると、機能しません。

それはなぜですか?


私はこれを使用していますが、うまく機能しません。

void cmbLanguages_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string locale = "es-ES";
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(locale);
            Thread.CurrentThread.CurrentCulture = new CultureInfo(locale);
        }
4

2 に答える 2

1

そのためにLocalizeExtensionを使用します。

.xaml では{LocText NAMESPACE::RESOURCENAME}、テキストを設定するために使用するだけであり、次の背後にあるコードでは、その場で言語を変更します。

Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
LocalizeDictionary.Instance.Culture = culture;

私が使用している Codeplex のプロジェクトをチェックして、拡張された例を確認できます:
XAMLCodeBehind (->SetUICulture)

于 2012-01-20T12:22:10.807 に答える
1

呼び出しの前に行うとコンストラクターで機能するはずですInitalizeComponent()が、例ではイベントハンドラーを示しています。が呼び出されると、 BAMLInitializeComponent()がリソースから読み込まれ、変更できなくなります。

https://www.codeproject.com/articles/29800/webcontrols/に示されているようなアプローチを使用して、新しいカルチャで新しいウィンドウを作成できます。

void SwitchCulture(CultureInfo newCulture)
{
    Thread.CurrentThread.CurrentUICulture = newCulture;
    Thread.CurrentThread.CurrentCulture = newCulture;
    // Reload all the merged dictionaries to reset the resources.
    List<Uri> dictionaryList = new List<Uri>();
    foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
    {
        dictionaryList.Add(dictionary.Source);
    }
    Application.Current.Resources.MergedDictionaries.Clear();
    foreach (Uri uri in dictionaryList)
    {
        ResourceDictionary resourceDictionary1 = new ResourceDictionary();
        resourceDictionary1.Source = uri;
        Application.Current.Resources.MergedDictionaries.Add( resourceDictionary1 );
    }

    MyWindowClass newWindow = new MyWiondowClass();
    // TODO: Attach any view model so the new window looks like the old one
    newWindow.Show();
    this.Close();
} 
于 2018-07-14T09:32:39.733 に答える