用 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步