zoukankan      html  css  js  c++  java
  • 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下载

  • 相关阅读:
    Teamwork[HDU4494]
    The Parallel Challenge Ballgame[HDU1101]
    「JSOI2016」无界单词
    「SCOI2015」小凸玩密室
    #3636. IIIDX(iiidx)
    #2652. 背单词(word)
    「JXOI2017」加法
    拙者
    19.10.01 acm E:Lowest Common Ancestor
    #3391. big
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1661090.html
Copyright © 2011-2022 走看看