如何设置和更改 WPF 中的文化

2024-06-23

我有一个 .NET 4.0 WPF 应用程序,用户可以在其中更改语言(文化) 我只是让用户选择一种语言,创建相应的 CultureInfo 并设置:

Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;

在 C# 代码中,这工作得很好。然而,在 WPF 控件中,文化仍然是 en-US。例如,这意味着日期将以美国格式显示,而不是适合当前文化的格式。

显然,这不是一个错误。根据 MSDN 以及 StackOverflow 上的几篇博客文章和文章,WPF 语言不会自动遵循当前文化。在您执行以下操作之前,它是 en-US:

FrameworkElement.LanguageProperty.OverrideMetadata(
    typeof(FrameworkElement),
    new FrameworkPropertyMetadata(
        XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag)));

参见示例wpf 中的 StringFormat 本地化问题 https://stackoverflow.com/questions/520115/stringfomat-localization-problem/520334#520334.

我不完全明白这里发生了什么。似乎所有框架元素上的语言属性都设置为当前文化。无论如何,它有效。我在应用程序启动时执行此操作,现在所有控件都按预期工作,例如日期根据当前文化进行格式化。

但现在的问题是:根据MSDNFrameworkElement.LanguageProperty.OverrideMetadata只能调用一次。事实上,如果我再次调用它(当用户更改语言时),它会抛出异常。所以我还没有真正解决我的问题。

问题:如何在应用程序生命周期的任何时间多次可靠地更新 WPF 中的区域性?

(我在研究的时候发现了这一点:http://www.nbdtech.com/Blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the- Correct-regional.aspx http://www.nbdtech.com/Blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the-correct-regional.aspx看来他在那里有一些工作。但是,我无法想象如何在我的应用程序中执行此操作。看来我必须更新所有打开的窗口和控件中的语言并刷新所有现有的绑定等。)


我要在这里插话。

我成功地使用了OverrideMetadata()OP提到的方法:

var lang = System.Windows.Markup.XmlLanguage.GetLanguage(MyCultureInfo.IetfLanguageTag);
FrameworkElement.LanguageProperty.OverrideMetadata(
  typeof(FrameworkElement), 
  new FrameworkPropertyMetadata(lang)
);

但是,我仍然在 WPF 中发现了系统区域性应用于日期和数值的实例。事实证明这些是值<Run>元素。它的发生是因为System.Windows.Documents.Run类不继承自System.Windows.FrameworkElement,因此元数据的覆盖FrameworkElement显然没有效果。

System.Windows.Documents.Run继承其Language财产来自System.Windows.FrameworkContentElement反而。

因此,显而易见的解决方案是覆盖元数据FrameworkContentElement以同样的方式。唉,做 do 抛出了一个异常(PropertyMetadata 已注册类型 System.Windows.FrameworkContentElement),所以我必须对下一个后代祖先这样做Run反而,System.Windows.Documents.TextElement:

FrameworkContentElement.LanguageProperty.OverrideMetadata(
  typeof(System.Windows.Documents.TextElement), 
  new FrameworkPropertyMetadata(lang)
);

这解决了我所有的问题。

还有几个子类FrameworkContentElement(列出here http://msdn.microsoft.com/en-us/library/system.windows.frameworkcontentelement%28v=vs.110%29.aspx)为了完整性,其元数据也应该被覆盖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置和更改 WPF 中的文化 的相关文章

  • 关闭时发送到托盘

    单击关闭按钮时如何将最小化的窗口发送到托盘 另外 如何在应用程序启动时在托盘中显示图标 WinForm 一种方法是在窗口的 F ormClosing 事件中设置 FormClosingEventArgs 的 Cancel 属性 然后最小化到
  • DateTimeOffset 如何处理夏令时?

    我将日程表以星期几 小时和分钟的形式存储在数据库中 当数据被读取时 我们创建一个DateTime对象下一次出现的那一天 一小时和一分钟 但我需要修改它以使其能够感知 DST 如有必要 我可以修改数据库 我知道DateTimeOffset存储
  • 关闭 Quartz .Net 中的调试日志记录

    我正在使用 Quartz NET 在我们的应用程序中安排一些自定义任务 一切工作正常 只是它在一秒钟内记录大约二十个调试条目 我不知道如何关闭调试日志记录 任何帮助将非常感激 因为我一直试图在网上查找但没有运气 调试条目如下所示 DEBUG
  • WPF 数据触发器和故事板

    当视图模型 演示模型繁忙时 我试图触发进度动画 我有一个 IsBusy 属性 并将 ViewModel 设置为 UserControl 的 DataContext 当 IsBusy 属性为 true 时 触发 progressAnimati
  • JIT编译后的代码是如何注入内存并执行的?

    考虑一个典型的 Windows x86 或 AMD64架构 内存为 分为可执行部分 无法写入 和 数据部分 可以写入但不能写入 被处决 想想 DEP JIT 在内存中编译方法 通常 不存储任何东西 磁盘 而是将其移动到哪里 下一条指令指针可
  • 寻找系统、全面、完整的VB.NET和C#语法比较

    我是一名经验丰富的 VB NET 开发人员 想从 C 开始 我正在寻找两种语言语法之间基于网络的比较作为快速参考 我发现自己正在整理 VB NET 语法模板 例如 Public MustInherit Class BaseClass Pub
  • Sql Server 2008 强制日期从 dd/MM/yyyy 到 MM/dd/yyyy

    我在 sql server 2008 上遇到了一个奇怪的问题 我试图用dd MM yyyy格式写入sql server 2008 但是插入日期后它会自动转换为MM dd yyyy 注意 我的电脑时钟格式是dd MM yyyy 我的报告查看器
  • IoC比较[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 开发 ASP NET Web 应用程
  • 调试调用 .Net(C#) dll 的 VB6 项目

    我已经被这个问题困扰了几个小时了 我希望有人遇到过类似的问题 我们使用 VS2010 开发了一个原型 Net C dll 并希望能够在 C 应用程序和 VB6 应用程序中调用该 dll 我的问题是 是否可以调试调用 Net dll 的 VB
  • 来自程序集的资源作为流

    我在 C WPF 应用程序中有一个图像 其构建操作设置为 资源 它只是源目录中的一个文件 尚未通过拖放属性对话框添加到应用程序的资源集合中 我试图将它写成一个流 但尽管尝试了很多点 斜杠 命名空间和看似其他所有内容的变体 但我无法打开它 我
  • 在 ReflectionOnly 模式下将程序集加载到新的 AppDomain 时,方法没有实现

    在我们的应用程序 包含 65 个项目的解决方案 中 所有引用的程序集都会在运行时分析是否存在 Ninject 模块 也应用了一些过滤 这些模块稍后会加载到 Ninject 内核中 并且每个模块都会声明内核的绑定 我们采用了一个加载器 以仅反
  • 使用 WPF 浏览器控件时如何重叠 BeforeNavigate 2?

    据我了解 WPF的Brwoser控件是ie Active X控件的包装 后者有一个 BeforeNavigate2 方法 而我在 WPF WebBrowser 控件中没有找到这个方法 有什么办法可以解决这个问题吗 谢谢 马克 是的 WPF的
  • Haskell:打印文本编码

    Haskell 新手在这里 ghc version The Glorious Glasgow Haskell Compilation System version 6 12 1 在尝试调试第三方 Haskell 程序中与区域设置相关的奇怪错
  • 从 SynchronizationContext 派生

    简而言之 我实现了一个从 SynchronizationContext 派生的类 以便 GUI 应用程序可以轻松地使用 GUI 线程以外的线程上引发的事件 我非常感谢对我的实施提出评论 具体来说 有什么是您建议反对的或可能会导致我未预见到的
  • 您如何使用 ReSharper 5 中的模式匹配功能?

    Resharper 5 的新模式匹配看起来非常强大 尽管需要一些修改才能弄清楚如何使用它 对于那些不熟悉此功能的人 它允许您在代码中搜索特定模式 此类模式的实例可以选择性地替换为替代方案 在 IntelliJ 中 这称为结构搜索和替换 它比
  • KeyEventArgs.Key 到 char

    有没有办法转换WPF的KeyEventArgs Key to Char 我尝试使用KeyInterop var x Char KeyInterop VirtualKeyFromKey e Key 对于数字和字母 它可以正常工作 但对于其他字
  • “内存泄漏”剖析

    从 NET 角度来看 什么是内存泄漏 https en wikipedia org wiki Memory leak 如何确定您的应用程序是否存在泄漏 有什么影响 如何防止内存泄漏 如果您的应用程序存在内存泄漏 当进程退出或被终止时它会消失
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似

随机推荐