VS2019 Добавить страницу свойств проекта - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь расширить страницу свойств проекта VS2019 и добавить новую, но не могу приступить к работе, если использую руководство Microsoft:

Добавление и удаление страниц свойств

Кто-нибудь может иметь пример кода?

РЕДАКТИРОВАТЬ:

Мой проект

У меня в настоящее время есть и обычный проект VSIX, который Я использовал для создания пакета редактора и успешно добавил пункты меню. Я просто хочу добавить страницу свойств проекта, которая будет использоваться во всех проектах "Библиотеки классов".

1 Ответ

0 голосов
/ 15 апреля 2020

У кого-нибудь может быть пример кода?

На самом деле, следуйте инструкциям, и вы можете получить то, что вы хотите.

Следуйте этому руководству:

Удалить страницу свойств

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

И затем вы можете изменить свой код с помощью этих методов.

Надеюсь, это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...