Я реализую настраиваемую языковую службу для 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
{
...
}
Как я уже писал, страница свойств отображается, когда я нажимаю команду «Свойства» в контекстном меню проекта (в обозревателе решений), но вместо представления с вкладками появляется немодальное диалоговое окно. Итак, вопрос в том, как я могу настроить его на желаемое поведение?