visual-studio - 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;}
解决方案
这个问题听起来很简单,但很难回答。我刚刚从头开始了一个新的 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()
方法并自己处理语言切换。毕竟,控件本身最清楚当语言发生变化时该做什么。 - 这仅反映了我当前使用的一组控件。如果您有其他控件类型,则必须添加相应的分支。把它们贴在这里,如果你有什么好主意!
推荐阅读
- php - 如何在 laravel 中访问我的域/管理员?
- css - CSS:flex-grow 保持垂直纵横比
- ios - 如何快速双击(而不是单击)集合视图单元格?
- javascript - 如何使用 FullCalendar.js 修复解析 json 失败的问题
- php - Laravel 5.8 Auth 脚手架 redirectTo 不起作用
- c# - 我可以在此 ManualResetEvent 中使用锁来确保线程安全吗?
- node.js - 响应多个数字
- android - 为旧版 Android 开发
- proxy - 从 Web 服务器向代理服务器发送请求
- php - 根据表单php上的检查字段选择数据库中的某些字段