资源文件已经创建。 在重新启动应用程序后,该语言开始工作。
是否可以动态切换gui(功能区)的语言?
已经尝试过: 更改cultureinfo并调用initializecomponents不起作用。
答案 0 :(得分:1)
我刚才就这个话题反对过来。我发现它是可能的,但它需要一些努力。我记得唯一的解决方案就是退出你的申请。此时批量启动将重新启动您的应用程序,以便用户在应用程序突然退出并消失时不会惊慌失措。当您的应用重新启动时,它将重新加载具有适当文化的所有ui元素。
我没有使用过这种方法,因为我不想退出我的应用程序才能进行更改。但这是有可能的。
您遇到的问题是文化确实在您的应用中发生变化,但您的控件未相应更新。重新启动“修复”了这个。
希望这有点帮助。
答案 1 :(得分:0)
我遇到了同样的问题,并找到了适合我的解决方案。它不需要转换器,但仍需要一段代码。使用.Net 4.5框架。
为了即时切换语言,需要两个不明显的事情:
使用另一种绑定到静态属性的风格,替换
<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设计器将为这些属性显示空字符串。)
更改通知不适用于资源。要解决此问题,请通过以下代码手动刷新静态绑定:
SELECT * FROM ticket
INNER JOIN works_on
ON ticket.custid = works_on.customerid
GROUP BY ticket.custid