【问题标题】:Outlook VSTO Event when the explorer changed资源管理器更改时的 Outlook VSTO 事件
【发布时间】:2019-08-01 03:53:39
【问题描述】:

我需要处理活动资源管理器对象上的选择更改事件。但是,当我在功能区加载时订阅事件 Globals.ThisAddIn.Application.ActiveExplorer().SelectionChange 时,它仅适用于当前活动的资源管理器。

是否有活动探索者之类的事件发生了变化?

我还尝试浏览了探索者列表Globals.ThisAddIn.Application.Explorers,但该列表仅包含已打开的探索者。

【问题讨论】:

    标签: c# outlook outlook-addin


    【解决方案1】:

    首先,不要在从多点表达式返回的对象上设置事件处理程序(例如Globals.ThisAddIn.Application.ActiveExplorer) - 您将在临时变量上设置事件处理程序,该变量将在垃圾收集器到达时立即释放它。该对象必须存储在一个变量中,保证在您的插件生命周期内保持活动状态。

    其次,使用Application.Explorers.NewExplorer事件来追踪新的Explorer(你也可以使用Explorer.Close事件来释放特定的Explorer对象)。

    创建一个包装类,将Explorer 对象存储为其成员(您可以将Explorer 传递给它的构造函数)并为Explorer.SelectionChange 和Explorer.Close 事件设置事件处理程序。在您的插件中,声明一个包装器列表 (List<MyExplorerWrapper>)。启动时,遍历Application.Explorers 集合中的所有资源管理器,并为Explorers.NewExplorer 事件设置一个事件处理程序(同样,Explorers 必须在插件类级别声明以使其保持活动状态)。

    【讨论】:

    • 释放是指取消订阅事件?
    • 您是指在 Explorer.Close 中吗?是的,取消订阅事件,使用 Marshal.ReleaseComObject 释放对象,并从父 List 中删除包装类。
    【解决方案2】:

    每当一个新的资源管理器窗口打开时,Explorers.NewExplorer 事件就会被触发,无论是作为用户操作的结果还是通过程序代码。

    Explorer.Activate 事件在资源管理器成为活动窗口时触发,无论是作为用户操作的结果还是通过程序代码。

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2018-03-25
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      相关资源
      最近更新 更多