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