IPropertyPage не отображается в режиме просмотра с вкладками

Я реализую настраиваемую языковую службу для Visual Studio; узел проекта должен предоставлять некоторые независимые от конфигурации страницы свойств (например, Application-, Debug-, Build Events, ...), которые отображаются в виде вкладок. Регистрация страниц свойств работает как-то, но они отображаются в немодальном диалоговом окне, что не является желаемым поведением ...

Вот что я сделал ...

Я создал класс PropertyPageBase, который реализует интерфейс IPropertyPage (при необходимости я могу предоставить более подробную информацию об этой реализации) ...

[ComVisible(true)]
public abstract class PropertyPageBase : IPropertyPage
{
    private Control control;

    protected abstract Control CreateControl();

    public Control Control
    {
        get { return this.control ?? (this.control = this.CreateControl()); }
    }

    ...
} 

Страницы настраиваемых свойств являются производными от этого базового класса; например...

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid(...)]
public sealed class GeneralPropertyPage : PropertyPageBase
{
    protected override Control CreateControl()
    {
        return new GeneralPropertyPageControl(this);
    }
}

Я использую MPF (Managed Package Framework для проектов) для реализации типов узлов для иерархии проекта. Итак, есть класс ProjectNodeBase (производный от MPF ProjectNode), в котором я переопределяю метод GetConfigurationIndependentPropertyPages; эта реализация получает страницы свойств из прикрепленных атрибутов; так что мне не нужно снова переопределять этот метод в моей конкретной реализации ...

public abstract class ProjectNodeBase : ProjectNode
{
    protected override Guid[] GetConfigurationIndependentPropertyPages()
    {
        Type thisType = this.GetType();

        IEnumerable<Type> pageTypes = thisType.GetCustomAttributes(typeof(ProvideProjectPropertyPageAttribute), true)
            .Cast<ProvideProjectPropertyPageAttribute>()
            .Select(x => x.PropertyPageType);

        return pageTypes.Select(x => x.GUID)
            .ToArray();
    }
}

В моем конкретном классе узла проекта я просто объявляю такие страницы свойств проекта ...

[ProvideProjectPropertyPageAttribute(PropertyPageType = typeof(GeneralPropertyPage))]
public sealed class CustomProjectNode : ProjectNodeBase 
{
    ...
}

Как я уже писал, страница свойств отображается, когда я нажимаю команду «Свойства» в контекстном меню проекта (в обозревателе решений), но вместо представления с вкладками появляется немодальное диалоговое окно. Итак, вопрос в том, как я могу настроить его на желаемое поведение?


person Matze    schedule 28.12.2013    source источник


Ответы (1)


Реализация IPropertyPage, показанная в вопросе, отлично работает ...

Причина, по которой страница не отображалась во фрейме страниц свойств с вкладками, была связана с классом CustomProjectNode (который представляет узлы проекта моей пользовательской системы проектов). Я использую модифицированную версию Managed Package Framework for Projects для иерархии моей системы проектов; поэтому CustomProjectNode является производным от класса ProjectNode MPF. Этот класс предоставляет свойство SupportsProjectDesigner, которое должно быть установлено в true.

[ProvideProjectPropertyPageAttribute(PropertyPageType = typeof(GeneralPropertyPage))]
public sealed class CustomProjectNode : ProjectNodeBase 
{
    public CustomProjectNode() : base()
    {
        this.SupportsProjectDesigner = true;
    }
}
person Matze    schedule 14.04.2014