VSTO, Visual Studio, MVP
RSS 2.0 Feed
2008-03 Entries
摘要:  之前的一篇 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 ...[阅读全文]

posted @ | Feedback (0) | Filed Under [ VSTO 资源 雕虫小技 原创 ]

摘要:  原以为土耳其“I”的问题已经是老生常谈,但事实证明大家都知道未必就是大家都能做到。今天在一段代码里面又一次发现了这个错误。   很简单,下面的代码:    string msg = "Info";    if (msg.ToLower() == "info")    {        ....    }   看起来没有什么问题,if 里面的代码应该会被执行吧?但是在土耳其语的系统中,故事就不同了。如果当前线程默认 Culture 是土耳其语,那么不带任何参数的 ToLower 会按照土耳其语的规则转换字符“I”。 在土耳其语中,字母“i”的对应大写是“İ”,而字母“ı”的对应大写才是“I”。   所以,上面的代码将会得到“不等”的结果。要避免默认 Culture 对文化无关的字符串转换、比较造成干扰,我们要使用 CultureInfo.InvariantCulture,或者用诸如 ToLowerInvariant() 之类的方法。 否则一个不小心,可能会给将来的调试、维护带来很多意外的麻烦。...[阅读全文]

posted @ | Feedback (0) | Filed Under [ 胡思乱想 随笔:随便写两笔 雕虫小技 原创 ]

摘要:在 MSDN 论坛上看到这样一个问题(原贴地址): “我在用 VSTO 2008 写一个 Outlook 2007 的插件。这个插件有一个窗体区域(Form Region)显示在‘约会’(Appointment)窗体中,我怎样才能捕捉‘约会’对象的‘保存’事件,以便在保存约会的时候执行一些我自己的代码?”     我提供了一个解决方案(其他类型的 Outlook 对象也有很类似的实现方法): 在用户区域装载的时候(FormRegionShowing 事件),把 OutlookItem 属性所引用的对象转换成 Outlook.Appointment 类型。 为 Appointment 注册 Write 事件的代码。 在 Write 事件处理方法中添加自定义代码实现业务逻辑要求。 当一个约会项目被显式(比如调用了 Save 方法或者按“保存”按钮)或者非显式(比如在关闭这个项目的窗口的时候作了答复操作)保存的时候,Write 事件就会被触发。这时候还可以通过设置 Cancel 参数来取消保存操作。 下面的代码片断展示了如何在 Form Region 里面注册 Write 事件。为了代码清晰,一切从简: 'Occurs before the form region is displayed.  'Use Me.OutlookItem to get a reference to the current Outlook item. 'Use Me.OutlookFormRegion to get a reference to the form region. Private Sub MyFormRegion_FormRegionShowing(ByVal sender As Object, _                                            ByVal e As System.EventArgs) _                                            Handles MyBase.FormRegionShowing     If TypeOf Me.OutlookItem Is Outlook.AppointmentItem Then         AddHandler CType(Me.OutlookItem, Outlook.AppointmentItem).Write, _                    AddressOf Item_Save     End If End......[阅读全文]

posted @ | Feedback (1) | Filed Under [ VSTO 资源 雕虫小技 原创 ]