2015-09-22 2 views
2

Quelles pourraient être les raisons possibles pour les événements de l'objet Explorer qui ne se déclenche pas? J'utilise le code simple ci-dessous, en enregistrant simplement les événements pour tous les objets Explorer. Je reçois toujours la ligne Init new Explorer! une fois dans la fenêtre de débogage, donc il y a un objet Explorer. Quand je clique alors autour dans les perspectives, passons du courrier à la vue de calendrier, sélectionnent des articles, commutons en arrière, passons aux contacts, ... je reçois seulement quelques (!) Des premiers événements, pas déterministe quel événement. Et après quelques secondes, je ne reçois plus d'événements malgré le fait de cliquer et de changer de vue. Quel est le problème ici?Outlook 2013 VSTO - Les événements de l'explorateur en cours ne sont pas déclenchés

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

Répondre

5

L'objet qui déclenche les événements doit être maintenu actif. Dans votre cas, vous définissez des gestionnaires d'événements sur l'objet transmis en tant que paramètre. Dès qu'il est hors de portée, il est libéré et aucun événement ne se déclenche. Les explorateurs et l'explorateur doivent être déclarés au niveau de la classe.

Vous pouvez également suivre l'événement Explorer.Close pour supprimer l'objet Explorer de la liste d'objets que vous regardez.

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; 
}