リソース ファイルは既に作成されています。アプリの再起動後の言語の切り替えは現在動作しています。
その場でgui(リボン)の言語を切り替えることは可能ですか?
すでに試しました: cultureinfo を変更して initializecomponents を呼び出しても機能しません。
リソース ファイルは既に作成されています。アプリの再起動後の言語の切り替えは現在動作しています。
その場でgui(リボン)の言語を切り替えることは可能ですか?
すでに試しました: cultureinfo を変更して initializecomponents を呼び出しても機能しません。
私も少し前にこの話題に飛びつきました。私が見つけたのはそれが可能であるということでしたが、それにはいくらかの努力が必要です. 私が覚えている唯一の解決策は、アプリケーションを終了することです。その瞬間、アプリケーションを再起動するバッチが開始されるため、アプリが突然終了して消えたときにユーザーがびっくりすることはありません。アプリが再起動すると、すべての UI 要素が適切なカルチャで再読み込みされます。
変更を加えるためにアプリを終了する必要がないため、この方法は使用していません。しかし、それは可能です。
あなたが経験しているのは、アプリのカルチャが変更されているのに、コントロールがそれに応じて更新されていないということです。再起動すると、これが「修正」されます。
これが少し役立ったことを願っています。
私は同じ問題に遭遇し、自分に合った解決策を見つけました。コンバーターは必要ありませんが、コードが必要です。.Net 4.5 フレームワークが使用されます。
オンザフライで言語を切り替えるには、2 つの明白でないことが必要です。
静的プロパティへのバインディングの別のフレーバーを使用し、 に置き換え
<TextBlock Text="{Binding Source={x:Static p:Resources.LocalizedString}}"/>
ます<TextBlock Text="{Binding Path=(p:Resources.LocalizedString)}"/>
。(かっこを使用したバインディング構文は、添付プロパティと静的プロパティに使用されます。副作用として、XAML デザイナーはこれらのプロパティに対して空の文字列を表示します。)
変更通知はリソースでは機能しません。これを回避するには、静的バインディングを次のコードで手動で更新します。
// ... 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);
}
}
}
}