wpf控件设计时支持(1)
这部分内容几乎是大家忽略的内容,我想还是来介绍一下.
本篇源码下载
1.属性元数据
![]()
在vs IDE中,在asp.net,winfrom等开发环境下,右侧的PropertyGrid属性面板,会对属性进行分类,这有利于了解控件属性的用途.
若你之前在.net平台下做过控件开发,你应该知道这些功能是通过属性元数据实现的,比如使用Category元数据,把Content属性分到Content类别下.
[Category("Content")]
public object Content { get; set; }
这种方法在开发wpf自定义控件依然可用.我们以名为DesginCustomControl的自定义控件为例子.因为是wpf控件,所以属性变更为依赖项属性.
public class DesginCustomControl : ContentControl
{ [Category("Content")]
public string Content
{
get { return (string)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
} public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(string), typeof(DesginCustomControl), new UIPropertyMetadata(String.Empty)); }
效果如下:
![]()
2.属性元数据集合
wpf的设计时允许我们将这些元数据与控件属性分离出来.下面我们来实现一个简单的功能
2.1新建一个设计时支持的单独项目
![]()
WPF.Controls是控件项目,WPF.Controls.VisualStudio.Design是控件设计时项目
注意:
(1)程序集命名约定
设计时的程序集是有命名约定的,这样才可以受到VisualStudio的支持.如控件程序集是WPF.Controls,那么设计时程序集则是
控件程序集的名字+VisualStudio.Design
(2)设计时程序集编译位置
设计时程序集必须与控件存放在同个目录下才能工作,引用控件的项目无需引用设计时程序集
假设WPF.Controls的编译目录没有做变更的话,那么WPF.Controls.VisualStudio.Design这个项目编译好后是存在在WPF.Controls的bin目录下面的.
(3)引用Microsoft.Windows.Design程序集
Microsoft.Windows.Design是wpf设计时支持的基础,所以要引用这个程序集
2.2注册属性的元数据集合
实现一个名为IRegisterMetadata的接口。来看一下代码
public class WPFControlsCommonMetadata : IRegisterMetadata
{
public void Register()
{
AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
MainBuilder.AddCustomAttributes(typeof(DesginCustomControl),DesginCustomControl.ContentProperty,new Attribute[]{
new CategoryAttribute("Content")});
MetadataStore.AddAttributeTable(MainBuilder.CreateTable());
}
}
AttributeTableBuilder是属性元数据表,msdn是解释属性表.AttributeTableBuilder有多个AddCustomAttributes重载方法.可以将元数据附加到属性上.比如上面代码给DesginCustomControl的Content属性添加了一个CategoryAttribute元数据.添加完毕以后再通过
MetadataStore的AddAttributeTable方法添加属性元数据表.MetadataStore称之为元数据存储区.
以上代码的实现与在控件上直接挂元数据标签效果是一样.有什么不同点呢?
若我们为asp.net的内置控件扩展设计时的话,则必须继承该控件.这里便不会有这个问题,两者是完全分离的.
2.3延迟添加属性元数据
上面的示例,直接在MainBuilder类中为控件添加元数据,当为比较多的控件添加元数据时,同时加载会出现性能问题,所以MainBuilder还提供了AddCallback方法,当需要时,才会为控件添加元数据.现以上示例代码变更如下
public class WPFControlsCommonMetadata : IRegisterMetadata
{
public void Register()
{
AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
MainBuilder.AddCallback(
typeof(DesginCustomControl),
delegate(AttributeCallbackBuilder builder)
{
builder.AddCustomAttributes(DesginCustomControl.ContentProperty, new Attribute[]{
new CategoryAttribute("Content")}); });
MetadataStore.AddAttributeTable(MainBuilder.CreateTable());
}
}
是不是感觉很无聊,为了这么个东西还要去研究:),觉得的有用的就看一下吧,这篇就写这么多,写完就差不多可以放假回家了.
wpf控件设计时支持(1)的更多相关文章
- wpf控件设计时支持(3)
原文:wpf控件设计时支持(3) wpf设计时调试 编辑模型 装饰器 1.wpf设计时调试 为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码 (1)将启动项目配 ...
- wpf控件设计时支持(2)
原文:wpf控件设计时支持(2) 这篇介绍在wpf设计时集合项属性添加项的定义和自定义控件右键菜单的方法 集合项属性设计时支持 1.为集合属性设计器识别具体项类型 wpf设计器允许定义集合项的类型,如 ...
- WPF解决按钮上被透明控件遮盖时无法点击问题
原文:WPF解决按钮上被透明控件遮盖时无法点击问题 IsHitTestVisible="False" 在控件上设置如上属性即可,即可让透明控件不触发点击效果
- 基于WPF系统框架设计(10)-分页控件设计
背景 最近要求项目组成员开发一个通用的分页组件,要求是这个组件简单易用,通用性,兼容现有框架MVVM模式,可是最后给我提交的成果勉强能够用,却欠少灵活性和框架兼容性. 设计的基本思想 传入数据源,总页 ...
- WPF控件获得焦点时去除虚线框
原文:WPF控件获得焦点时去除虚线框 <Setter Property="FocusVisualStyle" Value="{x:Null}" />
- 浅尝辄止——使用ActiveX装载WPF控件
1 引言 使用VC编写的容器类编辑器,很多都可以挂接ActiveX控件,因为基于COM的ActiveX控件不仅封装性不错,还可以显示一些不错的界面图元. 但是随着技术不断的进步,已被抛弃的Active ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- 《Dotnet9》系列-开源C# WPF控件库3《HandyControl》强力推荐
大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员.我最近开始写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用do ...
- WPF控件模板
引言:在进行WPF项目开发过程中,由于项目的需要,经常要对某个控件进行特殊的设定,其中就牵涉到模板的相关方面的内容.本文也是在自己进行项目开发过程中遇到控件模板设定时集中搜集资料后整理出来的,以供在以 ...
随机推荐
- autohotkey excel getfullname (ComObjActive)
- [HTML] Change an HTML5 input's placeholder color with CSS
We will look at what CSS selectors to use to change an HTML5 inputs placeholder color. This can diff ...
- sqoop 1.4.4-cdh5.1.2快速入门 分类: C_OHTERS 2015-06-06 11:40 208人阅读 评论(0) 收藏
一.快速入门 (一)下载安装 1.下载并解压 wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.4-cdh5.1.2.tar.gz tar - ...
- js中json数据简单处理(JSON.parse()和js中嵌套html)
js中json数据简单处理(JSON.parse()和js中嵌套html) 一.总结 1.html中嵌套js:<script>js代码</script> 2.js中嵌套html ...
- Android自定义组件系列【9】——Canvas绘制折线图
有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas ...
- Write Code As If You Had to Support It for the Rest of Your Life
Write Code As If You Had to Support It for the Rest of Your Life Yuriy Zubarev YOU COULD ASK 97 PEOP ...
- Python 语法细节(Python 2.x 与 Python 3.x 语法差异)
Language differences and workarounds 查询 Python 语言版本: >> import sys >> sys.version '3.5.2 ...
- Android 圆角ListView
方法一:定义 <?xml version ="1.0" encoding ="UTF-8" ?> <shape xmlns:android = ...
- 在 Java 中如何进行 BASE64 编码和解码
BASE64 编码是一种常用的字符编码,在很多地方都会用到.JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它们可以非常方便的完成基于 BASE64 的编码和 ...
- C#中使用split分割字符串的几种方法小结
1.用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray= ...