【问题标题】:How can I listen for the deletion of a ProjectItem via DTE?如何通过 DTE 监听 ProjectItem 的删除?
【发布时间】:2010-05-14 20:02:51
【问题描述】:

我有一个依赖于其他解决方案项目的设计器。如果其中一项被删除,设计器会崩溃,您必须将其编辑为 XML 才能修复。不完全是用户友好的。

不过,我确实拥有代表 Visual Studio 实例的 DTE 对象,以及我所依赖的 ProjectItems。

是否有可能在 DTE 深处的某个地方注册一个侦听器以删除该 ProjectItem?如果是这样,我该怎么做?

【问题讨论】:

    标签: visual-studio listener vsx envdte projectitem


    【解决方案1】:

    看起来这里的罪魁祸首是垃圾收集。我发现以下两个事件集的行为相同。

    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;
    

    【讨论】:

      【解决方案2】:

      查看this FAQ article,它解释了如何注册 ProjectItems 事件(包括 ItemDeleted)。

      【讨论】:

      • 无法让它正常工作,但这是我能做到的。
      猜你喜欢
      • 2016-01-23
      • 2014-02-17
      • 2019-02-05
      • 2013-06-18
      • 1970-01-01
      • 2018-12-14
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多