2010-05-14 5 views
3

У меня есть дизайнер, который полагается на существование других элементов решения. Если один из этих элементов удален, дизайнер выходит из строя, и вам нужно отредактировать его как XML для исправления. Не совсем удобный.Как я могу прослушивать удаление ProjectItem через DTE?

У меня, однако, есть объект DTE, представляющий экземпляр Visual Studio, а также объекты ProjectItems, на которых я зависим.

Возможно ли, где-то в глубине DTE, зарегистрировать прослушиватель для удаления этого ProjectItem? И если да, то как мне это сделать?

ответ

3

Похоже, что виновником здесь является сбор мусора. Я обнаружил, что следующие два набора событий ведут себя одинаково.

Events2 events2 = dte.Events as Events2; 
if (events2 != null) 
{ 
    this.projectItemsEvents = events2.ProjectItemsEvents; 
    this.projectItemsEvents.ItemAdded += this.ProjectItemsEvents_ItemAdded; 
    this.projectItemsEvents.ItemRemoved += this.ProjectItemsEvents_ItemRemoved; 
    this.projectItemsEvents.ItemRenamed += this.ProjectItemsEvents_ItemRenamed; 
} 

this.csharpProjectItemsEvents = 
    dte.Events.GetObject("CSharpProjectItemsEvents") as ProjectItemsEvents; 
if (this.csharpProjectItemsEvents != null) 
{ 
    this.csharpProjectItemsEvents.ItemAdded += this.CSharpProjectItemsEvents_ItemAdded; 
    this.csharpProjectItemsEvents.ItemRemoved += this.CSharpProjectItemsEvents_ItemRemoved; 
    this.csharpProjectItemsEvents.ItemRenamed += this.CSharpProjectItemsEvents_ItemRenamed; 
} 

Ключом к тому, чтобы быть уверенным, чтобы ссылка на объект событий у абонента. Как только я добавил ссылку, они вели себя так, как я ожидал.

private ProjectItemsEvents projectItemsEvents; 
private ProjectItemsEvents csharpProjectItemsEvents; 
1

Отъезд this FAQ article, который объясняет, как зарегистрироваться для событий ProjectItems (включая ItemDeleted).

+0

Никогда не мог заставить его работать должным образом, но это было как можно ближе. – Will