原文:wpf控件开发基础(2) -属性系统(1)

距离上篇写的时间有1年多了.wpf太大,写的东西实在太多,我将依然围绕着自定义控件来展开与其相关的技术点. 也欢迎大家参与讨论.这篇我们将要讨论的是WPF依赖属性,接触过的朋友应该对其有所了解,但在我们讲WPF依赖属性之前,我们来看看在WPF出现之前.net中的属性是如何使用的.

普遍存在的属性问题

  • c#基本属性
  • ASP.NET自定义控件属性
  • WinForm自定义控件属性
  • Javascript自定义控件属性

c#基本属性

namespace WPFControlTutorialPart2_Basic
{
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
//自动属性
public int Age { get; set; }
}
}

上面应该算是c#的最基础的属性,大家都很熟悉.

注意点:默认属性没有初始化,不然可能会发生很多未知的错误.

(以下可以选看,如果你接触过以下技术的话,其实也很简单)

ASP.NET自定义控件属性

namespace WPFControlTutorialPart2_WebApp
{
public class WebFromControl : WebControl
{
private string _controlName;
public string ControlName
{
get
{
return _controlName;
}
set
{
_controlName = value;
}
} protected override void RenderContents(HtmlTextWriter output)
{
output.Write("控件名字是:"+ControlName);
}
}
}

上面是一个简单的自定义的Web服务器控件.

asp.net控件着重在于呈现,每次刷新页面都将会调用RenderContents方法,这样就不管属性有没发生变化,都将得到重新呈现.即此处不需要属性发生变化,进行UI重绘通知.

注意点:如果强制要求ControlName属性必须是有值的,以保证输入结果的有效性,那么可以在get方法里处理

get
{
if (_controlName == null) _controlName = string.Empty;
return _controlName;
}

WinForm自定义控件属性

当属性发生变化时并未重绘,必须手动调用Invalidate方法以进入OnPaint方法重绘

注意点:如果要重绘界面的话,必须手动调用方法

JavaScript自定义控件属性

<div id="demoDiv" style="background-color: Red">hello</div>

<script>
function ElementControl(elementName) {
this.element = document.getElementById(elementName);
}
ElementControl.prototype.setWidth = function(width) {
this.element.style.width = width;
}
var obj = new ElementControl("demoDiv");
obj.setWidth("hello"); </script>

javascript的变量类型没有强类型,比如设置dom的宽度,其类型只能是整型,如果以字符串进行传值的话将会出错(当然这是人为的).

(不知道做过js前端控件的人有没这种感觉,定义了一个属性然后重新赋值重绘控件是一件痛苦的事,必须手动调动,而且会影响整个控件设计.)

注意点:要对于属性的赋值的有效性进行验证.

从以上几个例子,我们可以看出单纯的属性是无法满足程序需求的.
既以上的需求是有必要的,并且常常发生,而且非常频繁.

标准化解决方案

以上介绍了属性存在的一系列问题,那么有问题就会有简化的方案.

以下是个人总结的话

  1. 当一项技术比较复杂的时候,就会有人出来定义一套标准,以简化技术,提高生产效率.

  2. 不管设计者考虑的如何周密,一旦标准定义下来,就会丧失灵活性.
  3. 标准可能与你个人习惯想冲突,你必须去学会接受标准

回到WPF话题,那么在WPF中这个解决方案就是依赖属性(DependencyProperty)

好了,这篇只是一个引子,如果你在使用属性时,遇到过这些问题,那么你将有所感触.

如果你有认识到属性真实存在以上问题,那么这篇文章就算完成任务了.

这篇并不打算展开.下篇将再次介绍WPF依赖属性系统

欢迎大家展开讨论.

Demo下载

wpf控件开发基础(2) -属性系统(1)的更多相关文章

  1. wpf控件开发基础(3) -属性系统(2)

    原文:wpf控件开发基础(3) -属性系统(2) 上篇说明了属性存在的一系列问题. 属性默认值,可以保证属性的有效性. 属性验证有效性,可以对输入的属性进行校验 属性强制回调, 即不管属性有无发生变化 ...

  2. wpf控件开发基础(4) -属性系统(3)

    原文:wpf控件开发基础(4) -属性系统(3) 知识回顾 接上篇,上篇我们真正接触到了依赖属性的用法,以及依赖属性的属性元数据的用法,并且也实实在在地解决了之前第二篇提到的一系列问题.来回顾一下 属 ...

  3. wpf控件开发基础

    wpf控件开发基础(3) -属性系统(2) http://www.cnblogs.com/Clingingboy/archive/2010/02/01/1661370.html 这个有必要看看 wpf ...

  4. wpf控件开发基础(5) -依赖属性实践

    原文:wpf控件开发基础(5) -依赖属性实践 知识回顾 接上篇,回顾这三篇讲了什么东西 首先说明了属性的现存问题,然后介绍了依赖属性的基本用法及其解决方案,由于依赖属性以静态属性的方式存在,进而又介 ...

  5. asp.net控件开发基础(1)(转)原文更多内容

    asp.net本身提供了很多控件,提供给我们这些比较懒惰的人使用,我认为控件的作用就在此,因为我们不想重复工作,所以要创建它,这个本身便是一个需求的关系,所以学习控件开发很有意思. wrox网站上有本 ...

  6. WPF控件开发(2) 自动完成(AutoComplete)-1

    自动完成功能使用范围很广,多以TextBox或ComboBox的形式出现,在输入的同时给予候选词,候选词一般有两种方式获取. 一种类似Baidu,Google,Bing之类的搜索引擎所用的直接给予前十 ...

  7. 跟我一起学WPF(2):WPF控件基础

    WPF控件简介 通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构.我们看一个简单的例子. <Button.Cont ...

  8. 浅谈Winform控件开发(一):使用GDI+美化基础窗口

    写在前面: 本系列随笔将作为我对于winform控件开发的心得总结,方便对一些读者在GDI+.winform等技术方面进行一个入门级的讲解,抛砖引玉. 别问为什么不用WPF,为什么不用QT.问就是懒, ...

  9. C# Winform开发以及控件开发的需要注意的,被人问怕了,都是基础常识

    我是搞控件开发的,经常被人问,所以把一些问题记录了下来!如果有人再问,直接把地址丢给他看. 一. 经常会有人抱怨Winform界面闪烁,下面有几个方法可以尽可能的避免出现闪烁 1.控件的使用尽量以纯色 ...

随机推荐

  1. iOS INVALID_USER_SCODE 定位 用户安全码未通过

    iOS 高德地图API不能定位及INVALID_USER_SCODE问题,有需要的朋友可以参考下. 一.在使用高德地图的API的时候,没有办法实现定位,在这里说一下在真机测试的时候出现没法定位应该注意 ...

  2. BAPC2014 C&amp;&amp;HUNNU11583:Citadel Construction(几何)

    题意: 给出一系列的点,要求寻找最多4个点.使得组成一个面积最大的多边形 思路: 非常显然仅仅有两种情况.要么是三角形,要么是四边形 首先不难想到的是.先要把最外面的点都找出来,事实上就是找凸包 可是 ...

  3. ARM 授权费用太贵 科技巨头欲转向开源架构 RISC-V

    不久前,特斯拉加入 RISC-V 基金会,并考虑在新款芯片中使用免费的 RISC-V 设计.至此,已有 IBM.NXP.西部数据.英伟达.高通.三星.谷歌.华为等 100 多家科技公司加入 RISC- ...

  4. java数组10大技巧

    0.  声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {"a"," ...

  5. [HTTP] Understand 2xx HTTP Status Code Responses

    The 2xx family of status codes are used in HTTP responses to indicate success. Beyond the generic 20 ...

  6. 《大型网站技术架构》1:概述 分类: C_OHTERS 2014-05-07 20:40 664人阅读 评论(0) 收藏

    参考自<大型网站技术架构>第1~3章 1.大型网站架构演化发展历程 (1)初始阶段的网站架构:一台服务器分别作为应用.数据.文件服务器 (2)应用服务和数据服务分离:三台服务器分别承担上述 ...

  7. centos7安装nginx的两种方法

    第一种方式:通过yum安装 直接通过 yum install nginx 肯定是不行的,因为yum没有nginx,所以首先把 nginx 的源加入 yum 中 运行下面的命令: 1.将nginx放到y ...

  8. Android Material Design 5.0 PickerDialog

    5.0系统下的时间选择器效果图: 该项目兼容到3.0下面所以用第三方开源项目:actionbarsherlock,动画效果兼容:nineoldandroids-2.4.0.jar,格式转换器:joda ...

  9. Windows批处理(cmd/bat)常用命令

    Windows批处理(cmd/bat)常用命令 一.总结 一句话总结: 1.批量处理图片的方式? PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本: 2.大量的重复的操作 ...

  10. centos7 rabbitmq安装/配置

    原文:centos7 rabbitmq安装/配置     因为RabbitMQ是由erlang实现的,所以要先安装erlang再安装rabbitMQ   1.先配置yum软件源地址EPEL(EPEL是 ...