IPropertyPage未显示在选项卡式视图中

时间:2013-12-28 00:02:02

标签: visual-studio-2012 visual-studio-extensions vsx vsix vs-extensibility

我正在为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(项目的托管包框架)来实现项目层次结构的节点类型。那么,有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 
{
    ...
}

正如我所写,当我在项目的上下文菜单(在解决方案资源管理器中)中单击属性命令时,将显示属性页面,但是不显示选项卡式视图,而是显示非模态对话框。那么,问题是,我如何将其调整为想要的行为?

1 个答案:

答案 0 :(得分:0)

问题中显示的IPropertyPage实施工作正常......

页面未显示在选项卡式属性页框架中的原因与CustomProjectNode类(表示我的自定义项目系统的项目节点)有关。我为项目系统层次结构使用Managed Package Framework for Projects的修改版本;所以CustomProjectNode来自MPF的ProjectNode类。此类提供SupportsProjectDesigner属性,该属性必须设置为true

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