WPF多语言GUI即时切换

时间:2009-07-01 18:33:03

标签: wpf multilingual

资源文件已经创建。 在重新启动应用程序后,该语言开始工作。

是否可以动态切换gui(功能区)的语言?

已经尝试过: 更改cultureinfo并调用initializecomponents不起作用。

2 个答案:

答案 0 :(得分:1)

我刚才就这个话题反对过来。我发现它是可能的,但它需要一些努力。我记得唯一的解决方案就是退出你的申请。此时批量启动将重新启动您的应用程序,以便用户在应用程序突然退出并消失时不会惊慌失措。当您的应用重新启动时,它将重新加载具有适当文化的所有ui元素。

我没有使用过这种方法,因为我不想退出我的应用程序才能进行更改。但这是有可能的。

您遇到的问题是文化确实在您的应用中发生变化,但您的控件未相应更新。重新启动“修复”了这个。

希望这有点帮助。

答案 1 :(得分:0)

我遇到了同样的问题,并找到了适合我的解决方案。它不需要转换器,但仍需要一段代码。使用.Net 4.5框架。

为了即时切换语言,需要两个不明显的事情:

  1. 使用另一种绑定到静态属性的风格,替换 <TextBlock Text="{Binding Source={x:Static p:Resources.LocalizedString}}"/> <TextBlock Text="{Binding Path=(p:Resources.LocalizedString)}"/> // ... 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); } } } } 。 (带括号的绑定语法用于附加属性和静态属性。作为副作用,XAML设计器将为这些属性显示空字符串。)

  2. 更改通知不适用于资源。要解决此问题,请通过以下代码手动刷新静态绑定:

    SELECT * FROM ticket
    INNER JOIN works_on
    ON ticket.custid = works_on.customerid
    GROUP BY ticket.custid