五:理解控件的运行机制(例:基于Control命名空间的简单控件)

简介: 一:先用最简短的话说点理论的1.asp.net中所有的标准控件都可以重写2.和控件相关的命名空间有  System.Web.UI.Control是所有控件的基类只提供简单的呈现逻辑,不支持样式表  System.

一:先用最简短的话说点理论的
1.asp.net中所有的标准控件都可以重写

2.和控件相关的命名空间有
  System.Web.UI.Control
是所有控件的基类
只提供简单的呈现逻辑,不支持样式表
  System.Web.UI.WebControls.WebControl
继承自Control
支持控件外观
  System.Web.UI.WebControls.CompositeControl
继承自WebControl类
派生出多个控件合成的复合控件

3.控件树的实现原理
首先Page类本身就是一个控件,它继承自Control
所有的控件都有一个Render方法
这个方法负责把控件的内容发送给请求者
在Render方法中会调用一个RenderChildren方法
RenderChildren方法触发所有子控件的生成行为
子控件又有Render方法
子子孙孙无穷尽也...
这就实现了控件树

二开始看例子
建立一个工程
在工程下建立一个类库
其中有一个类,继承自Control类
注意类库要引用web名称空间

using  System;
using  System.Collections.Generic;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Text;

namespace  hellowControl
{
    
public   class  HellowControl:Control
    {
        
protected   override   void  Render(HtmlTextWriter writer)
        {
            
// 要先写div的样式
            writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign,  " center " );
            writer.AddStyleAttribute(HtmlTextWriterStyle.Width, 
" 180px " );
            writer.AddStyleAttribute(HtmlTextWriterStyle.Height, 
" 180px " );
            writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, 
" 1px " );
            writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, 
" solid " );
            writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, 
" grey " );
            
// 再写div开始标签
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            
// 开始写div里的内容,是一个图片
            
// 先写图片的样式和属性
            writer.AddAttribute(HtmlTextWriterAttribute.Src,  " noimage_s.jpg " );
            writer.AddStyleAttribute(HtmlTextWriterStyle.Margin, 
" 8px " );
            
// 写image标签开始
            writer.RenderBeginTag(HtmlTextWriterTag.Img);
            
// 闭合image标签
            writer.RenderEndTag();
            
// 闭合div标签
            writer.RenderEndTag();
        }
    }
}

个人感觉这个逻辑有点怪异
除了这些也不多说了
然后生成这个类库
你将得到一个dll文件
在你的工具箱中点右键>>>选择项
浏览找到刚才的dll
然后你会发现,你的工具箱里多了一个控件
拖到你的页面就能使用了

这里注意writer.WriteBeginTag()等方法
和writer.RenderBeginTag()是有区别的

 
目录
相关文章
|
4月前
|
设计模式 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理
|
前端开发 C# 图形学
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了。用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架。依赖属性(DependencyProperty)是为用户控件提供可支持双向绑定的必备技巧之一,同样用处也非常广泛。
954 0
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Winform控件优化之继承Control重写实现Layer遮罩层
通过继承Control控件类,进行重写,实现Layer效果的遮罩层,具体使用可直接看后面的介绍。主要功能如下:1. 遮罩层的透明度Alpha,默认125。255表示不透明。2. 设置遮罩层中心的图片
647 0
Winform控件优化之继承Control重写实现Layer遮罩层
|
Web App开发 JavaScript 前端开发
给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
    写自定义控件已经好久了,也有几个用得时间比较长的,但是对于“事件”一直是比较模糊,没有很详细的理解。          最近升级分页控件,由于原来使用的是VB.net(在VB.net里面添加一个事件是比较容易的),现在想改用C#,而原来的方法又写得比较笨拙,想换一个更简洁一点的方法,所以不得不重新认识一下事件。
978 0
|
前端开发 C# 容器
WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.
1164 0
|
C#
WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探         最近因为项目需要,开始学习如何使用WPF开发桌面程序。
1564 0
|
C# 数据安全/隐私保护
WPF 使用附加属性增加控件属性
原文:WPF 使用附加属性增加控件属性 使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活   一、自定义附加属性 1 2 3 4 5 6 7 8 9 10 11 ...
896 0
|
C# 前端开发
WPF 绑定Command方式
WPF中,我们使用MVVM,在ViewModel中定义Command和其业务逻辑,界面绑定Command。 那么是不是所有的事件都可以定义Command呢,然后将业务全部放在ViewModel中呢? 界面CommandBindings 如果只是交互的处理,可以直接定义RoutedCommand即可 1.
2077 0
|
C#
WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问
原文:WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问 1,在菜单中访问 弹出菜单的控件 var mi = sender as MenuItem;//菜单条目 MenuItem var cm = mi.
991 0
|
C#
WPF整理-为User Control添加依赖属性
原文:WPF整理-为User Control添加依赖属性 依赖属性 ".NET properties are nothing more than syntactic sugar over set and get methods." 我们知道.NET的属性只不过是get/set方法的语法糖衣。
877 0