当我启动程序时,我从MainWindow_OnContentRendered添加了ComboBox,以及ComboBox.Item将如何找到资源文件来更改不同的语言?> 。如何实现 WPF 组合框内容全球化。谢谢。
你好。
A.
1.
public void MyComboBox()
{
ComboBox.Item.add(USB1)
ComboBox.Item.add(USB2)
ComboBox.Item.add(USB3)
}
2.
MainWindow_OnContentRendered
{
MyComboBox();
}
B.
//ResourceHelper.cs
public static void LoadResource(string ) {
var = (from d in _Resourcelist where d.ToString().Equals() select d).FirstOrDefault();
App.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(langType, UriKind.RelativeOrAbsolute) });
Thread.CurrentThread.CurrentCulture = cultureInfo;
hread.CurrentThread.CurrentUICulture = cultureInfo;}
这个问题听起来很简单,但很难回答。我刚刚从头开始启动一个新的 WPF 应用程序,因此我考虑了在运行时切换到其他语言的问题。当然,您必须像在示例中那样设置CurrentCulture
和CurrentUICulture
。但是控件及其文本内容呢?
我的解决方案是一个递归方法,我以MainWindow.Content
作为参数调用该方法,然后它通过控件层次结构进行越来越深入的迭代:
private static void ReloadAllText(object root)
{
if (root is TextBlock textBlock1)
{
UpdateBinding(textBlock1, TextBlock.TextProperty);
}
else if (root is ContentControl contentControl)
{
if (contentControl.Content is string)
{
UpdateBinding(contentControl, ContentControl.ContentProperty);
}
else
{
ReloadAllText(contentControl.Content);
}
}
else if (root is Panel panel)
{
foreach (var child in panel.Children)
{
ReloadAllText(child);
}
}
else if (root is ItemsControl itemsControl)
{
for (int cnt = 0, cntMax = VisualTreeHelper.GetChildrenCount(itemsControl); cnt < cntMax; cnt++)
{
if (VisualTreeHelper.GetChild(itemsControl, cnt) is TextBlock textBlock2)
{
ReloadAllText(textBlock2);
}
}
foreach (var item in itemsControl.Items)
{
ReloadAllText(item);
}
}
else if (root is Decorator decorator)
{
ReloadAllText(decorator.Child);
}
else if (root is IRaiseLanguageChanged customItem)
{
customItem.RaiseLanguageChanged();
}
}
该方法由几个分支组成:
- 对于
TextBlock
(默认情况下也用作其他更复杂的控件中的文本显示元素),Text
属性设置为新值。就我而言,我只是更新绑定。就您而言,新文本可能有不同的来源,我不知道您的架构。 - 对于
ContentControl
(即具有Content
属性的任何控件),它取决于: 如果内容只是一个字符串,我可以立即将其设置为新值。如果它更复杂,那么我必须更深入地递归。 - 对于
Panel
(这是StackPanel
、DockPanel
、Grid
等的基类),我只是为每个子元素递归。 - 对于
ItemsControl
(也为了你的ComboBox
!),我为每个项目递归。我添加VisualTree
部分只是因为我有一个空列表框的控件模板,该列表框仅包含一个表示"无项目"的TextBox
。如果ItemsSource
绑定到枚举类型,则必须续订ItemsSourceProperty
绑定。 - 对于
Decorator
(例如Border
),我为它唯一的孩子递归。 - 对于自定义/自制控件,我已经定义了一个自定义接口
IRaiseLanguageChanged
,因此它们必须实现RaiseLanguageChanged()
方法并自行处理语言切换。毕竟,控件本身最清楚语言更改时该怎么做。 - 这仅反映了我当前使用的控件集。如果您有其他控件类型,则必须添加相应的分支。如果您有任何好主意,请在此处发布它们!