首页 > 解决方案 > ComboBox.Item.add(USB1)切换语言-----全球化-VS 2019 WPF

问题描述

我从 MainWindow_OnContentRendered 添加了 ComboBox,当我启动程序时,ComboBox.Item 将如何找到资源文件来更改不同的语言?>。我如何才能将 WPF ComboBox 内容全球化。谢谢。

你好。

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;}
           



  

标签: visual-studiocomboboxlocalizationaddglobalization

解决方案


这个问题听起来很简单,但很难回答。我刚刚从头开始了一个新的 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(这是 , 等的基类StackPanelDockPanelGrid我只是对每个子元素进行递归。
  • 对于ItemsControl (你的也是如此ComboBox!),我对每个项目进行递归。我添加该VisualTree部分只是因为我有一个空列表框的控件模板,其中仅包含TextBox“无项目”的说法。如果绑定ItemsSource到枚举类型,则必须更新ItemsSourceProperty绑定。
  • 对于Decorator(例如Border),我递归它的单个孩子。
  • 对于自定义/自制控件,我已经定义了一个自定义接口IRaiseLanguageChanged,所以他们必须自己实现一个RaiseLanguageChanged()方法并自己处理语言切换。毕竟,控件本身最清楚当语言发生变化时该做什么。
  • 这仅反映了我当前使用的一组控件。如果您有其他控件类型,则必须添加相应的分支。把它们贴在这里,如果你有什么好主意!

推荐阅读