添加和删除属性页
项目设计器提供了一个集中位置,用于管理 Visual Studio 中的项目属性、设置和资源。 它显示为 Visual Studio 集成开发环境(IDE)中的单个窗口,并在右侧包含通过左侧选项卡访问的多个窗格。 项目设计器中的窗格(通常称为属性页)因项目类型和语言而异。 可以使用“项目”菜单上的“属性”命令访问项目设计器。
项目子类型经常需要在项目设计器中显示其他属性页。 同样,某些项目子类型可能需要删除内置属性页。 若要执行上述任一操作,项目子类型必须实现 IVsHierarchy 接口并重写 GetProperty 方法。 通过重写此方法并使用 propId
包含枚举值 __VSHPROPID2 之一的参数,可以筛选、添加或删除项目属性。 例如,可能需要将页面添加到与配置相关的属性页。 为此,需要筛选依赖配置的属性页,然后将新页添加到现有列表。
GetProperty(uint itemId, int propId, out object property)
重写方法以筛选属性页并获取clsids
列表。protected override int GetProperty(uint itemId, int propId, out object property) { //Use propId to filter configuration-independent property pages. switch (propId) { . . . . case (int)__VSHPROPID2.VSHPROPID_PropertyPagesCLSIDList: { //Get a semicolon-delimited list of clsids of the configuration-independent property pages ErrorHandler.ThrowOnFailure(base.GetProperty(itemId, propId, out property)); string propertyPagesList = ((string)property).ToUpper(CultureInfo.InvariantCulture); //Remove the property page here . . . . } . . . . } . . . . return base.GetProperty(itemId, propId, out property); }
从获取
clsids
的列表中删除“生成事件”页。string buildEventsPageGuid = "{1E78F8DB-6C07-4D61-A18F-7514010ABD56}"; int index = propertyPagesList.IndexOf(buildEventsPageGuid); if (index != -1) { // GUIDs are separated by ';' so if you remove the last GUID, also remove the last ';' int index2 = index + buildEventsPageGuid.Length + 1; if (index2 >= propertyPagesList.Length) propertyPagesList = propertyPagesList.Substring(0, index).TrimEnd(';'); else propertyPagesList = propertyPagesList.Substring(0, index) + propertyPagesList.Substring(index2); } //New property value property = propertyPagesList;
创建要添加的属性页。
class DeployPropertyPage : Form, Microsoft.VisualStudio.OLE.Interop.IPropertyPage { . . . . //Summary: Return a structure describing your property page. public void GetPageInfo(Microsoft.VisualStudio.OLE.Interop.PROPPAGEINFO[] pPageInfo) { PROPPAGEINFO info = new PROPPAGEINFO(); info.cb = (uint)Marshal.SizeOf(typeof(PROPPAGEINFO)); info.dwHelpContext = 0; info.pszDocString = null; info.pszHelpFile = null; info.pszTitle = "Deployment"; //Assign tab name info.SIZE.cx = this.Size.Width; info.SIZE.cy = this.Size.Height; if (pPageInfo != null && pPageInfo.Length > 0) pPageInfo[0] = info; } }
注册新的属性页。
GetProperty(uint itemId, int propId, out object property)
重写方法以筛选属性页、获取clsids
列表并添加新属性页。protected override int GetProperty(uint itemId, int propId, out object property) { //Use propId to filter configuration-dependent property pages. switch (propId) { . . . . case (int)__VSHPROPID2.VSHPROPID_CfgPropertyPagesCLSIDList: { //Get a semicolon-delimited list of clsids of the configuration-dependent property pages. ErrorHandler.ThrowOnFailure(base.GetProperty(itemId, propId, out property)); //Add the Deployment property page. property += ';' + typeof(DeployPropertyPage).GUID.ToString("B"); } } . . . . return base.GetProperty(itemId, propId, out property); }