• 自定义控件的构建(10)


         通过前面一系列的改进,我们已经可以初步构建出一个功能相对比较全面的控件了,那么,本篇关注一下我们一直忽略的地方,即如何在VS设计器中显示。

    设计器体验

         这主要有两种方式:控件设计时特性与关联ControlDesigner,下面一一介绍:

         控件设计时特性用于修改控件的属性在设计视图中如何显示,其中一些特性可以直接应用到控件本身,一些可以用到控件的属性上

         比如讲Description用于指定属性的说明信息,这个部分比较丰富,可以通过UITypeEditor类查看包含的编辑器列表,

         我们先定义一个控件,看看这些特性是如何用的

        public class DefaultTitleControl:WebControl
    
        {
    
            private string _title="Title";
    
            [Category("Control Title")]
    
            [Description("title")]
    
            public string Title
    
            {
    
                get { return _title; }
    
                set { _title = value; }
    
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
    
            {
    
                writer.RenderBeginTag(HtmlTextWriterTag.H1);
    
                writer.Write(_title);
    
                writer.RenderEndTag();
    
            }
    
            protected override HtmlTextWriterTag TagKey
    
            {
    
                get { return HtmlTextWriterTag.Div; }
    
            }
    
        }

          代码很简洁,看看当我们在页面上放置一个控件时,设计视图所呈现的

         捕获

          其中Title属性在属性窗口中关联了类别和说明,相信你看完截图后,就什么都明白了,不解释。

          主要说另一种方式,即创建ControlDesigner,其可以改变自定义控件在设计视图中的外观,和上面的一样,我们也只关注其中的一个特性即可

          创建一个可以从工具箱中拖拉其它控件到自定义的控件

      /// <summary>
    
        ///允许在设计视图中拖入其他控件
    
        /// </summary>
    
        public enum GradientDirection
    
        {
    
            Vertical=0,
    
            Horizontal=1
    
        }
    
         [Designer(typeof(DragDesinger))]
    
         [ParseChildren(false)]
    
        public class DragOtherControl : WebControl
    
        {
    
            public DragOtherControl()
    
            {
    
                this.Width = Unit.Parse("500px");
    
            }
    
            private GradientDirection _dragDirection = GradientDirection.Horizontal;
    
            private Color _startColor = Color.DarkBlue;
    
            public Color StartColor
    
            {
    
                get { return _startColor; }
    
                set { _startColor = value; }
    
            }
    
            private Color _endColor = Color.White;
    
            public Color EndColor
    
            {
    
                get { return _endColor; }
    
                set { _endColor = value; }
    
            }
    
            public GradientDirection Direction { get; set; }
    
            protected override HtmlTextWriterTag TagKey
    
            {
    
                get { return HtmlTextWriterTag.Div; }
    
            }
    
            protected override void AddAttributesToRender(HtmlTextWriter writer)
    
            {
    
                writer.AddStyleAttribute(HtmlTextWriterStyle.Filter, this.GetFilterString());
    
                base.AddAttributesToRender(writer);
    
            }
    
            public string GetFilterString()
    
            {
    
                return string.Format("progid:DXImageTransform.Mircosoft.Gradient(gradientType={0},startColorStr={1},endColorStr={2})", _dragDirection.ToString("d"), ColorTranslator.ToHtml(_startColor), ColorTranslator.ToHtml(_endColor));
    
            }
    
        }
    
        public class DragDesinger:ContainerControlDesigner
    
        {
    
            protected override void AddDesignTimeCssAttributes(IDictionary styleAttributes)
    
            {
    
                DragOtherControl drager = (DragOtherControl)this.Component;
    
                styleAttributes.Add("filter",drager.GetFilterString());
    
                base.AddDesignTimeCssAttributes(styleAttributes);
    
            }
    
        }
      上面定义的DragOtherControl使用了IE滤镜创建渐变背景,这里的功能实现不是重点, 同时定义了DragDesinger类,你可以看到实际上DragOtherControl被
      DragDesinger修饰了,这样如果从工具箱中拖动其它控件到DragOtherControl中时,就可以作为其子元素存在,比如拖一个CheckBox:
       <userExpr:DragOtherControl ID="DragOtherControl1" runat="server">
    
            <asp:CheckBox ID="CheckBox1" runat="server" />
    
       </userExpr:DragOtherControl>  

      本文参考了《ASP.NET 3.5揭秘》

  • 相关阅读:
    有效管理时间的十八种方法
    针对某个块下面的按钮注册点击事件
    vs2015运行项目时出现“编译器失败,错误代码为 1”的解决方案
    淘宝API调用 申请 获取session key
    中小型研发团队架构实践:生产环境诊断利器WinDbg帮你快速分析异常情况Dump文件
    中小型研发团队架构实践:如何规范公司所有应用分层?
    中小型研发团队架构实践:电商如何做企业总体架构?
    中小型研发团队架构实践:高效率、低风险,一键发布并测试的持续集成工具Jenkins
    ASP.NET全栈开发验证模块之在Vue中使用前端校验
    计算机基础存储结构
  • 原文地址:https://www.cnblogs.com/626498301/p/1795399.html
Copyright © 2020-2023  润新知