У кого-нибудь может быть пример кода?
На самом деле, следуйте инструкциям, и вы можете получить то, что вы хотите.
Следуйте этому руководству:
Удалить страницу свойств
1) создать проект vsix c# в IDE VS2019, а затем добавить новый класс, такой как RemovePage
2), а затем добавить эти пространства имен в этом файле:
using EnvDTE;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
и реализуют интерфейс IVsHierarchy
и добавляют методы его реализации.
3) После этого в нижней части страницы добавьте основную функцию чтобы понять это:
protected 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(GetProperty(itemId, propId, out property));
string propertyPagesList = ((string)property).ToUpper(CultureInfo.InvariantCulture);
//Remove the property page here
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;
break;
}
}
Добавьте страницу свойств
1) добавьте новый класс с именем DeployPropertyPage
и реализуйте Form и Microsoft.VisualStudio.OLE.Interop.IPropertyPage
. После этого добавьте метод реализации по запросу.
2) добавьте следующие пространства имен:
using Microsoft.VisualStudio.OLE.Interop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.VisualStudio.Shell;
using MSVSIP = Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
3) измените функцию по умолчанию GetPageInfo
на:
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;
}
4) добавьте основную функцию в соответствии с указанным в нижней части файла документом:
protected 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(GetProperty(itemId, propId, out property));
//Add the Deployment property page.
property += ';' + typeof(DeployPropertyPage).GUID.ToString("B");
break;
}
}
return GetProperty(itemId, propId, out property);
}
5) затем зарегистрируйте новую страницу свойств перед именем класса DeployPropertyPage
.
[MSVSIP.ProvideObject(typeof(DeployPropertyPage), RegisterUsing = RegistrationMethod.CodeBase)]
Обновление 1
DeployPropertyPage примерно так:
class DeployPropertyPage:IPropertyPage
{
public void SetPageSite(IPropertyPageSite pPageSite)
{
throw new NotImplementedException();
}
public void Activate(IntPtr hWndParent, RECT[] pRect, int bModal)
{
throw new NotImplementedException();
}
public void Deactivate()
{
throw new NotImplementedException();
}
public void GetPageInfo(PROPPAGEINFO[] pPageInfo)
{
throw new NotImplementedException();
}
public void SetObjects(uint cObjects, object[] ppunk)
{
throw new NotImplementedException();
}
public void Show(uint nCmdShow)
{
throw new NotImplementedException();
}
public void Move(RECT[] pRect)
{
throw new NotImplementedException();
}
public int IsPageDirty()
{
throw new NotImplementedException();
}
public int Apply()
{
throw new NotImplementedException();
}
public void Help(string pszHelpDir)
{
throw new NotImplementedException();
}
public int TranslateAccelerator(MSG[] pMsg)
{
throw new NotImplementedException();
}
}
RemovePage вот так:
class RemovePage: IVsHierarchy
{
public int SetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider psp)
{
throw new NotImplementedException();
}
public int GetSite(out Microsoft.VisualStudio.OLE.Interop.IServiceProvider ppSP)
{
throw new NotImplementedException();
}
public int QueryClose(out int pfCanClose)
{
throw new NotImplementedException();
}
public int Close()
{
throw new NotImplementedException();
}
public int GetGuidProperty(uint itemid, int propid, out Guid pguid)
{
throw new NotImplementedException();
}
public int SetGuidProperty(uint itemid, int propid, ref Guid rguid)
{
throw new NotImplementedException();
}
public int GetProperty(uint itemid, int propid, out object pvar)
{
throw new NotImplementedException();
}
public int SetProperty(uint itemid, int propid, object var)
{
throw new NotImplementedException();
}
public int GetNestedHierarchy(uint itemid, ref Guid iidHierarchyNested, out IntPtr ppHierarchyNested, out uint pitemidNested)
{
throw new NotImplementedException();
}
public int GetCanonicalName(uint itemid, out string pbstrName)
{
throw new NotImplementedException();
}
public int ParseCanonicalName(string pszName, out uint pitemid)
{
throw new NotImplementedException();
}
public int Unused0()
{
throw new NotImplementedException();
}
public int AdviseHierarchyEvents(IVsHierarchyEvents pEventSink, out uint pdwCookie)
{
throw new NotImplementedException();
}
public int UnadviseHierarchyEvents(uint dwCookie)
{
throw new NotImplementedException();
}
public int Unused1()
{
throw new NotImplementedException();
}
public int Unused2()
{
throw new NotImplementedException();
}
public int Unused3()
{
throw new NotImplementedException();
}
public int Unused4()
{
throw new NotImplementedException();
}
}
И затем вы можете изменить свой код с помощью этих методов.
Надеюсь, это может помочь вам.