WPF自定义控件设计时支持

在开发WPF应用程序时,为第三方UI控件提供设计时支持是一个重要的环节。本文将介绍如何为WPF控件库添加设计时支持,特别是如何使用DesignSurface来简化设计器的开发。

什么是DesignSurface

DesignSurface是一个装饰器(adorners),能够为设计器类中的设计器动词集合自动生成属性编辑器。这意味着,无论控件类型是什么,DesignSurface都能帮处理值的变更并更新设计器,只需要从DesignSurface派生并添加感兴趣的设计器动词,然后将其构建到一个单独的程序集中,并与控件库一起部署。

准备工作

在开始之前,了解一些构建和部署设计器扩展项目的指导原则是必要的。以下是一些基本规则:

  • 为项目名称添加“.Design”后缀,例如,如果控件库名为“Creatives.CustomControl”,则设计器项目应命名为“Creatives.CustomControl.Design”。
  • 在命名空间上添加[ProvideMetadata(typeof(YourNamespace.YourDesigner))]特性,以指示程序集提供了关于控件设计器的元数据。
  • 将设计器DLL与控件库一起部署到GAC或设计器从控件库中获取的根文件夹。

设计器扩展部署在不同的DLL中,并且只在Visual Studio设计器上下文中有效,它不会影响控件的运行时行为。

如何开始

让看看如何开始使用DesignSurface。假设已经有了自己的自定义控件,并且打算使用DesignSurface来添加设计器支持。

首先,设置一个设计器项目。例如,有一个名为“DesignerExpander”的简单控件,它从Expander派生而来。现在,需要为客户提供良好的设计时体验,将定义设计器动词,DesignSurface将处理其余的工作。

DesignerExpander实际上就是一个Expander控件,需要在设计器中暴露以下属性:

  • DesignerExpander.HeaderProperty – 控件标题文本
  • DesignerExpander.ContentProperty – 控件主体文本
  • DesignerExpander.IsExpandedProperty – 获取或设置内容是否展开
  • DesignerExpander.VisibilityProperty – 获取或设置控件的可见性

实现IProvideDesignerVerbs接口用于收集designerverb,并添加上述四个属性到设计器动词集合中。

public DesignerVerbCollection GetDesignerVerbs() { DesignerVerbCollection verbs = new DesignerVerbCollection(); verbs.AddHeader("CustomControl Editor"); verbs.AddHeader("Appearance"); verbs.AddProperty(DeisgnerExpander.HeaderProperty, "Header"); verbs.AddProperty(DeisgnerExpander.ContentProperty, "Content"); verbs.AddHeader("Behavior"); verbs.AddProperty(DeisgnerExpander.IsExpandedProperty, "IsExpanded"); verbs.AddProperty(DeisgnerExpander.VisibilityProperty, "Visibility"); return verbs; }

在DesignSurface的构造函数中注册设计器类型,并提供控件类型的信息。

DesignSurface.RegisterDesignerVerbProvider(typeof(DeisgnerExpander), typeof(CustomControlDesigner)); public override Type ControlType { get { return typeof(DeisgnerExpander); } }

工作原理

现在已经了解了如何设置,让快速浏览一下项目中使用的帮助器和包装器,然后深入概念。

  • DesignerVerb – 定义在设计时装饰器中显示的Item,可以是Header或PropertyEditor。
  • DesignerVerbCollection – 定义IEnumerable<designerverb>,允许向集合中添加属性、标题或DesignerVerb。
  • PropertyGrid – 简单工作,消耗设计器动词并构建属性编辑器。
  • GridFactory – 决定给定属性的编辑器类型并生成编辑器。

本文到此结束,希望喜欢。不要忘记留下评论和建议。下次见!

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485