ComboBox.Item.add(USB1) 开关语言-----全球化 - VS 2019 WPF.



当我启动程序时,我从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 应用程序,因此我考虑了在运行时切换到其他语言的问题。当然,您必须像在示例中那样设置CurrentCultureCurrentUICulture。但是控件及其文本内容呢?

我的解决方案是一个递归方法,我以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(这是StackPanelDockPanelGrid等的基类),我只是为每个子元素递归。
  • 对于ItemsControl(也为了你的ComboBox!),我为每个项目递归。我添加VisualTree部分只是因为我有一个空列表框的控件模板,该列表框仅包含一个表示"无项目"的TextBox。如果ItemsSource绑定到枚举类型,则必须续订ItemsSourceProperty绑定。
  • 对于Decorator(例如Border),我为它唯一的孩子递归。
  • 对于自定义/自制控件,我已经定义了一个自定义接口IRaiseLanguageChanged,因此它们必须实现RaiseLanguageChanged()方法并自行处理语言切换。毕竟,控件本身最清楚语言更改时该怎么做。
  • 这仅反映了我当前使用的控件集。如果您有其他控件类型,则必须添加相应的分支。如果您有任何好主意,请在此处发布它们!

相关内容

  • 没有找到相关文章

最新更新