2015-09-22 5 views
2

Какие могут быть причины для событий объекта Explorer не стрелять? Я использую простой код ниже, просто регистрируя события для всех объектов Explorer. Я всегда получаю строку Init new Explorer! в окне отладки один раз, поэтому есть один объект Explorer. Когда я затем нажимаю в Outlook, переключаюсь с почты на просмотр календаря, выбираю элементы, переключаюсь обратно, переключаюсь на контакты, ... Я получаю только некоторые (!) Из первых событий, а не детерминированные какие события. И через несколько секунд я не получаю больше событий, несмотря на то, что вы меняете и меняете мнения. Что здесь не так?Outlook 2013 VSTO - События для текущего исследователя не увольняются

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!"); 
} 

ответ

5

Объект, в котором происходят события, должен храниться в живых. В вашем случае вы настраиваете обработчики событий для объекта, который передается в качестве параметра. Как только он выходит из сферы действия, он освобождается, и никакие события не срабатывают. И Исследователи, и Проводник должны быть объявлены на уровне класса.

Возможно, вы также захотите отследить событие 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; 
}