Outlook 2013 VSTO - 不会触发当前资源管理器的事件

Tor*_*mme 2 .net outlook vsto outlook-addin outlook-2013

Explorer物体不发射的事件可能是什么原因?我正在使用下面的简单代码,只是为所有Explorer对象注册事件.我总是Init new Explorer!在调试窗口中获取一行,因此有一个Explorer对象.当我在Outlook中单击时,从邮件切换到日历视图,选择项目,切换回,切换到联系人,...我只得到一些(!)的第一个事件,而不是确定性的哪个事件.几秒钟之后,尽管仍然保持点击和更改视图,但我没有获得更多活动.这有什么不对?

private void ThisAddInStartup(object sender, System.EventArgs e)
{
    foreach (var exp in this.Application.Explorers)
    {
        this.ExplorersOnNewExplorer(exp as Explorer);
    }
    this.Application.Explorers.NewExplorer += this.ExplorersOnNewExplorer;
}

private void ExplorersOnNewExplorer(Explorer currentExplorer)
{
    Debug.WriteLine("Init new Explorer!");

    currentExplorer.BeforeViewSwitch += this.CurrentExplorerOnBeforeViewSwitch;
    currentExplorer.BeforeFolderSwitch += this.CurrentExplorerOnBeforeFolderSwitch;
    currentExplorer.SelectionChange += this.CurrentExplorerOnSelectionChange;
    currentExplorer.ViewSwitch += this.CurrentExplorerOnFolderSwitch;
    currentExplorer.FolderSwitch += this.CurrentExplorerOnFolderSwitch;
}
private void CurrentExplorerOnBeforeFolderSwitch(object newFolder, ref bool cancel)
{
    Debug.WriteLine("BeforeFolderSwitch!");
}

private void CurrentExplorerOnBeforeViewSwitch(object newView, ref bool cancel)
{
    Debug.WriteLine("BeforeViewSwitch!");
}

private void CurrentExplorerOnFolderSwitch()
{
    Debug.WriteLine("CurrentExplorerOnFolderOrViewSwitch!");
}

private void CurrentExplorerOnSelectionChange()
{
    Debug.WriteLine("Selection changed!");
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 5

触发事件的对象必须保持活动状态.在您的情况下,您在作为参数传递的对象上设置事件处理程序.一旦超出范围,它就会被释放,并且不会发生任何事件.必须在类级别声明Explorers和Explorer.

您可能还想跟踪Explorer.Close事件,以从正在观察的对象列表中删除Explorer对象.

private List<Explorer> _explorers = new List<Explorer>();
private Explorer explorer;
private void ThisAddInStartup(object sender, System.EventArgs e)
{
    _explorers = this.Application.Explorers;
    foreach (var exp in _explorers)
    {
        this.ExplorersOnNewExplorer(exp as Explorer);
    }
    _explorers.NewExplorer += this.ExplorersOnNewExplorer;
}

private void ExplorersOnNewExplorer(Explorer currentExplorer)
{
    _explorers.Add(currentExplorer);
    Debug.WriteLine("Init new Explorer!");

    currentExplorer.BeforeViewSwitch += this.CurrentExplorerOnBeforeViewSwitch;
    currentExplorer.BeforeFolderSwitch += this.CurrentExplorerOnBeforeFolderSwitch;
    currentExplorer.SelectionChange += this.CurrentExplorerOnSelectionChange;
    currentExplorer.ViewSwitch += this.CurrentExplorerOnFolderSwitch;
    currentExplorer.FolderSwitch += this.CurrentExplorerOnFolderSwitch;
}
Run Code Online (Sandbox Code Playgroud)