3

リソース ファイルは既に作成されています。アプリの再起動後の言語の切り替えは現在動作しています。

その場でgui(リボン)の言語を切り替えることは可能ですか?

すでに試しました: cultureinfo を変更して initializecomponents を呼び出しても機能しません。

4

2 に答える 2

1

私も少し前にこの話題に飛びつきました。私が見つけたのはそれが可能であるということでしたが、それにはいくらかの努力が必要です. 私が覚えている唯一の解決策は、アプリケーションを終了することです。その瞬間、アプリケーションを再起動するバッチが開始されるため、アプリが突然終了して消えたときにユーザーがびっくりすることはありません。アプリが再起動すると、すべての UI 要素が適切なカルチャで再読み込みされます。

変更を加えるためにアプリを終了する必要がないため、この方法は使用していません。しかし、それは可能です。

あなたが経験しているのは、アプリのカルチャが変更されているのに、コントロールがそれに応じて更新されていないということです。再起動すると、これが「修正」されます。

これが少し役立ったことを願っています。

于 2011-03-09T15:03:23.940 に答える
0

私は同じ問題に遭遇し、自分に合った解決策を見つけました。コンバーターは必要ありませんが、コードが必要です。.Net 4.5 フレームワークが使用されます。

オンザフライで言語を切り替えるには、2 つの明白でないことが必要です。

  1. 静的プロパティへのバインディングの別のフレーバーを使用し、 に置き換え <TextBlock Text="{Binding Source={x:Static p:Resources.LocalizedString}}"/>ます<TextBlock Text="{Binding Path=(p:Resources.LocalizedString)}"/>。(かっこを使用したバインディング構文は、添付プロパティと静的プロパティに使用されます。副作用として、XAML デザイナーはこれらのプロパティに対して空の文字列を表示します。)

  2. 変更通知はリソースでは機能しません。これを回避するには、静的バインディングを次のコードで手動で更新します。

    // ... after the current culture has changed
    UpdateStaticBindings(Application.Current.MainWindow, typeof(Properties.Resources), true);
    
    /// <summary>
    /// Update all properties bound to properties of the given static class.
    /// Only update bindings like "{Binding Path=(namespace:staticClass.property)}".
    /// Bindings like "{Binding Source={x:Static namespace:staticClass.property}}" cannot be updated.
    /// </summary>
    /// <param name="obj">Object that must be updated, normally the main window</param>
    /// <param name="staticClass">The static class that is used as the binding source, normally Properties.Resources</param>
    /// <param name="recursive">true: update all child objects too</param>
    static void UpdateStaticBindings(DependencyObject obj, Type staticClass, bool recursive)
    {
        // Update bindings for all properties that are statically bound to
        // static properties of the given static class
        if (obj != null)
        {
            MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(obj);
    
            if (markupObject != null)
            {
                foreach (MarkupProperty mp in markupObject.Properties)
                {
                    if (mp.DependencyProperty != null)
                    {
                        BindingExpression be = BindingOperations.GetBindingExpression(obj, mp.DependencyProperty) as BindingExpression;
    
                        if (be != null)
                        {
                            // Only update bindings like "{Binding Path=(namespace:staticClass.property)}"
                            if (be.ParentBinding.Path.PathParameters.Count == 1)
                            {
                                MemberInfo mi = be.ParentBinding.Path.PathParameters[0] as MemberInfo;
                                if (mi != null && mi.DeclaringType.Equals(staticClass))
                                {
                                    be.UpdateTarget();
                                }
                            }
                        }
                    }
                }
            }
    
            // Iterate children, if requested
            if (recursive)
            {
                foreach(object child in LogicalTreeHelper.GetChildren(obj))
                {
                    UpdateStaticBindings(child as DependencyObject, staticClass, true);
                }
            }
        }
    }
    
于 2015-11-26T00:57:56.057 に答える