zoukankan      html  css  js  c++  java
  • zz在加载项中更新 CultureInfo 信息

          之前的一篇 Blog 提到了关于在不同的 Culture 环境中对字符串的转换和比较需要注意的地方,这又让我想到了前一阵子在英文 MSDN 论坛 VSTO 板块上为一个用户解决的问题:

      用 VSTO 开发一个 Outlook 的加载项,在 Outlook (以及这个加载项)运行的过程中,如果用户修改了“控制面板——区域设置”中的 Culture 信息,比如日期的显示格式;怎样在不重新启动 Outlook 或这个加载项的前提下马上反映出用户所做的修改?

      我们的第一反应就是“在格式化数据(日期或者数字等等)的时候,用 CurrentCulture 就可以了”。可事实上这还不够。因为 CultureInfo 的相关信息在第一次被调用之后,就缓存起来了,直到它所在的 AppDomain 生命周期结束。如果系统的区域设置发生变化,CultureInfo 是不会自动反映出来的。我们需要用 CultureInfo.ClearCachedData 方法手工更新这些信息。

      为了知道系统的区域设置发生了变化,我们可以通过注册 SystemEvents.UserPreferenceChanged 事件来获得通知。

      另外值得注意的是,在加载项卸载之前,我们必须要注销事件通知,否则可能会发生内存泄漏。

      完整示例代码:

    Imports System.Globalization
    Imports Microsoft.Win32

    Public Class ThisAddIn

        Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
            AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged
        End Sub

        Private Sub SystemEvents_UserPreferenceChanged(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
            If (e.Category = UserPreferenceCategory.Locale) Then  ' 发生变化的项目:区域设置
                CultureInfo.CurrentCulture.ClearCachedData()
            End If
        End Sub

        Private Sub ThisAddIn_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
            RemoveHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged
        End Sub

    End Class

  • 相关阅读:
    保险行业电话外呼型呼叫中心方案
    12355青少年服务台呼叫中心解决方案
    未能找到类型集或命名空间名称 "xxxxxx" (是否缺少using 指令或引用?)
    Smarty中section的使用
    什么是Asterisk,它如何帮助我们的呼叫中心?
    高效呼叫中心的8个健康工作习惯
    Python 爬起数据时 'gbk' codec can't encode character 'xa0' 的问题
    Python 网页解析器
    Python 爬虫入门3种方法
    Python open 读写小栗子
  • 原文地址:https://www.cnblogs.com/end/p/1520794.html
Copyright © 2011-2022 走看看