900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C#自定义控件VS用户控件

C#自定义控件VS用户控件

时间:2019-08-05 01:41:44

相关推荐

C#自定义控件VS用户控件

C#自定义控件VS用户控件

1、C#中自定义控件VS用户控件大比拼2、为自定义控件(或类)的方法属性添加注解2.1、Description:在属性窗口中添加属性及属性说明2.2、Browsable2.3、EditorBrowsable2.4、Category2.5、ToolboxBitmap2.6、DefaultEvent和DefaultProperty 3、自定义用户控件设置为容器

1、C#中自定义控件VS用户控件大比拼

自定义控件与用户控件区别

WinForm中,用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Controls控件

自定义控件(Custom Control):继承自 Control,主要用于开发windows控件的最基本的类,比如 Text,Button 控件

要开发自己的控件的几种方法

复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满足用户的需求。

扩展控件(Extended Controls):就是在现有的控件基础上,派生出一个新的控件,增加新的功能,或者修改原有功能,来满足用户需求。

自定义控件(Custom Controls):就是直接从System.Windows.Forms.Control类派生,也就是说完全由自己来设计、实现一个全新的控件,这是最灵活、最强大的方法,但是,对开发者的要求也是最高的。要实现一个自定义控件,必须为Control类的的OnPaint事件编写代码,在OnPaint事件中实现自定义控件的绘制工作。同时,还可以重写Control类的WndProc方法,来处理底层的Windows消息。所以说,要实现一个自定义控件,对开发者的要求较高,要求开发者必须了解GDI+和Windows API的知识。

2、为自定义控件(或类)的方法属性添加注解

2.1、Description:在属性窗口中添加属性及属性说明

设置显示在属性窗口的描述属性功能的文字说明。

使用例子

[Description("边框宽度"), Category("自定义")]public virtual int RectWidth{get{return this._rectWidth;}set{this._rectWidth = value;Refresh();}}

2.2、Browsable

指定属性是否应该在属性窗口中显示,使用布尔值设置。一般情况下,对于常用的和比较重要的属性设置Browsable为true,否则,设置Browsable为false。

2.3、EditorBrowsable

设置属性在编辑器中的可见性,比如设置在智能提示列表不显示或高级用户才可以看到

2.4、Category

指定属性在属性浏览器中进行分组显示的类别。

命名空间: ponentModel

程序集: System(位于 System.dll)

该设计时特性帮助可视化编辑器将属性进行逻辑分组。通常分为:外观(Appearance)、行为(Behavior)、布局(Layout)、数据(Data)、操作(Action)、键盘(Key)和鼠标(Mouse)等。如果您安装的是中文版的IDE,则默认情况下中文分类和英文分类是通用的,即设置成“数据”或“Data”类别是等价的。

[Description("边框宽度"), Category("自定义")]public virtual int RectWidth{get{return this._rectWidth;}set{this._rectWidth = value;Refresh();}}

2.5、ToolboxBitmap

实现用户自定义控件中嵌入自己的图标。

本文实例讲述了C#实现用户自定义控件中嵌入自己的图标。分享给大家供大家参考,具体如下:

具体的步骤。

向资源文件是添加一张图片,图片格式可以是bm,ico 大小最好是 16 * 16 啦!

选中用户控件图标,单击“右键》属性”把“生成操作的属性值改为:嵌入的资源(Action Resource)

[ToolboxBitmap(typeof(CutPitureNew_WPF), "CutPitureNew_WPF.ico")]public partial class CutPitureNew_WPF : UserControl{public CutPitureNew_WPF()}

关键在添加这一句:

[ToolboxBitmap(typeof(MyControl), "Resources.vb6tovb7.bmp")]

2.6、DefaultEvent和DefaultProperty

指定自定义控件的默认事件和默认属性。

DefaultEventAttribute(MSDN)可以用来指定组件的默认事件,如在TestUserControl类上面加入代码

[DefaultEvent("BtnTestClick")]

那在Form编辑界面,双击控件testUserControl1就会自动进入testUserControl1_BtnTestClick事件。

这里再说明一下,C#中的System.Windows.Forms.Control类代码如下:

[ClassInterface(ClassInterfaceType.AutoDispatch)][ComVisible(true)][DefaultEvent("Click")][DefaultProperty("Text")][Designer("System.Windows.Forms.Design.ControlDesigner, System.Design, Version=4.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")][DesignerSerializer("System.Windows.Forms.Design.ControlCodeDomSerializer, System.Design,Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","ponentModel.Design.Serialization.CodeDomSerializer, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")][ToolboxItemFilter("System.Windows.Forms")]public class Control : Component, IDropTarget, ISynchronizeInvoke, IWin32Window, IBindableComponent, IComponent, IDisposable{/* ... */ }

这里可以看到DefaultEvent的值为“Click”,这也就是为什么拖入Form的按钮(Button),在双击后会进入它的Click事件:

private void button1_Click(object sender, EventArgs e)

对于不希望以Click事件作为默认事件的控件来说,要手动指定该控件的DefaultEvent特性,如复选框(CheckBox)的声明:

[ClassInterface(ClassInterfaceType.AutoDispatch)][ComVisible(true)][DefaultBindingProperty("CheckState")][DefaultEvent("CheckedChanged")][DefaultProperty("Checked")][ToolboxItem("System.Windows.Forms.Design.AutoSizeToolboxItem,System.Design,Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]public class CheckBox : ButtonBase{/* ... */ }

这里的DefaultEvent被写上了“CheckedChange”,因此在Form的编辑界面,双击复选框时默认进入的编辑事件为

private void checkBox1_CheckedChanged(object sender, EventArgs e)

自定义的控件(直接继承自UserControl),如果不添加这个属性,在编辑界面双击后进入的事件是Load事件。

类似的特性还有DefaultProperty,DefaultPropertyAttribute(MSDN)可以被用来指定组件的默认属性。指定默认属性后,当用户在Form里单击这个控件时,将在属性浏览窗口中自动选定该属性:

[DefaultProperty("BtnName")]

3、自定义用户控件设置为容器

如果编写了一个控件,这个控件上还可以容纳Button的控件,那么这个自己编写的控件必须设置为容器。

将 UserControl 放在 Windows 窗体上之后,如何将 UserControl 对象用作设计时控件容器

本分步指南介绍在将 UserControl 放在 Windows 窗体上之后,如何将 UserControl 对象用作设计时控件容器。可能会有这样的情况:您想将一个控件拖到 UserControl 中。为做到这一点, UserControl 必须用作控件容器。

概述

默认情况下,UserControl 对象只有在您创建它时才可以用作控件容器。在将 UserControl 放在 Windows 窗体上之后,为让UserControl 承载构成控件,您必须更改 UserControl 的默认设计器。如要为一个组件实现设计时服务,请使用ponentModel 名称空间的 DesignerAttribute 类。DesignerAttribute 出现在类声明前面。通过传递designerTypeNameDesignerAttribute参数初始化designerTypeName

designerTypeName 是提供设计时服务的设计器类型的完全合格的名称。传递 designerTypeName 参数的System.Windows.Forms.Design.ParentControlDesignerSystem.Design的组合。ParentControlDesigner 类扩展了UserControl 的设计时行为。

designerBaseType 是设计器的基类的名称。用于设计时服务的类必须实现 IDesigner 接口。

将 UserControl 创建为设计时控件容器

创建一个新的 Visual C# .NET Windows 控件库项目。为此,请按照下列步骤操作:启动 Visual Studio .NET。在“文件”菜单上,指向“新建”,然后单击“项目”。在“项目类型”下,单击 “Visual C# 项目”,然后单击“模板”下的 “Windows 控件库”。将该项目命名为 ContainerUserControl。默认情况下将创建出 “UserControl1.cs”。在解决方案资源管理器中,右键单击 “UserControl1.cs”,然后单击“查看代码”。将下面的代码添加到 Declarations 部分:

using ponentModel.Design;

如下所示将ponentModel.DesignerAttribute 属性应用到该控件:

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] public class UserControl1 :System.Windows.Forms.UserControl {...}

在“生成”菜单上,单击“生成解决方案”。

测试 UserControl

创建一个新的 Visual C# 项目。为此,请按照下列步骤操作:启动 Visual Studio .NET。在“文件”菜单上,指向“新建”,然后单击“项目”。在“项目类型”下,单击 “Visual C# 项目”,然后单击“模板”下的 “Windows 应用程序”。默认情况下将创建出 “Form1.cs”。将 “UserControl1” 从工具箱(在“Windows 窗体”下)拖到 “Form1.cs”。将一个按钮控件从工具箱拖到 “UserControl1”。您会注意到 “UserControl1” 起到了按钮控件的控件容器的作用。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。