用Visual C# .NET开发简单的复合控件

 我来答
大沈他次苹0B
2022-10-08 · TA获得超过7333个赞
知道大有可为答主
回答量:3059
采纳率:100%
帮助的人:179万
展开全部

   内容提要

  本文介绍如何用Visual C# NET 开发简单的复合控件(Composite Control) 主要讲解控件开发过程中的属性(Property)和事件(Event)处理 以方便开发人员在 NET平台下根据自己的需要开发适合的控件

  当我们在 NET平台下做Windows Forms开发时 常常需要为了某一特殊用途而把现有控件结合起来使用 比如结合了Label和TextBox的控件就非常容易在窗体上布局(记得Delphi 里就有这么个控件) 而结合了特定图案和文字的控件则非常适合显示公司的logo NET平台就为我们提供了非常棒的工具和技术来创建这样的自定义控件 下面让我们来一起创作一个可以自动显示时间的控件 值得注意的是 NET平台为我们提供了三种控件的开发技术 分别是 继承控件(Extended Control) 复合控件(Composite Control)和自定义控件(Custom Control)(译名可能会有所不同 大家可以以英文为准) 我们现在关心的是第二种——复合控件 OK Let s go! .创建控件工程

  在Visual C# NET中新建一个 Windows控件库 项目 命名为 TimeLabel .更改命名空间 控件类名称

  默认的命名空间是TimeLabel(和项目名称一样) 控件类名称是UserControl 请把命名空间改为与你的开发习惯一致 如我的是LeoYang Controls TimeLabel 当然你也可以选择保留默认命名空间 最好把控件类名称改为有意义的命名 如TimeLabel 这样当该控件出现在工具箱上时 就会显示为TimeLabel而不是UserControl 了 注意 一旦改动类名 则相应的Construction方法名称也要相应改掉 如 public UserControl () { … } 就要改为 public TimeLabel() { … }

   .添加现有控件

  由于我们是要在现有控件的基础上创建新控件 所以就应该先把可用的现有控件添加到控件设计界面上 请在 工具箱 中双击Label 再双击Timer 两个现有控件依次被添加到我们的设计界面上 如图

    

   .公布控件属性

  因为要把时间写入Label的Text属性中 所以我们需要把label Text属性公开 请在TimeLabel类中加入以下代码 public string LabelText { get { return label Text; } } 注意 这里我们不需要让控件使用者改变label Text的值 所以LabelText是个只读属性 另外 出于美观的考虑 我们这里还要向控件使用者公开一个LabelBackColor属性 用于获得和设置Label的BackColor属性 代码如下 public Color LabelBackColor { get { return label BackColor; } set { label BackColor=value; } } 当然 你也可以根据需要再增加一些属性 如字体 控件大小等 让控件使用者可以更加灵活地使用控件 到这里 我需要向大家补充一点 复合控件创建中的很重要的一条是 任何构成控件(Constituent Control)的属性必须要通过加入复合控件的属性来公开 而不要直接把构成控件直接以public级别公开 比如说上面 我们就不应把Label控件的访问级别设为public来直接公开(默认是private) 这样作的目的是让我们能更好地把握控件的数据安全 从而只把那些最需要的属性公开给控件用户

   .时间显示的处理

  到现在 我们就可以增加代码来让我们的控件显示时间了 首先请把timer 的Interval属性设为 也就是 秒的时隔 然后双击timer 在其Tick事件处理过程中增加以下代码 label Text=System DateTime Now ToLongTimeString();

  这样 每隔一秒钟 我们的Label就会重新显示当前系统时间 最后 请双击TimeLabel控件上的空白处 在出现的TimeLabel_Load事件处理过程中增加以下代码来激活Timer timer Enabled=true; 这样 Timer就会忠心耿耿地开始计算时间 并更新Label上的时间文字了 .事件处理

  由于是继承自UserControl的控件 所以TimeLabel从一开始便拥有了Click DragDrop FontChanged等事件 我们现在要做的是增加一个自定义事件——Tick 以便通知使用我们控件的窗体时间已经改变了 因为我们只需要简简单单地让这个事件发生 所以不需创建我们自己的代理(delegate)函数 也不需创建特殊的事件处理事据对象 OK 请看下面的代码 首先在TimeLabel类里增加Tick事件声明 public event EventHandler Tick; 然后给该事件编写一个调用过程 请注意该过程的命名 protected void OnTick (EventArgs e) { if(Tick!=null) { Tick(this e); } } 另外 在上面处理过的Timer的Tick事件处理过程中 还应增加对OnTick的调用 代码如下 private void timer _Tick(object sender System EventArgs e) { label Text=System DateTime Now ToLongTimeString(); OnTick(e); }

    

   .创建试验项目

  在Visual C# NET中通过 文件 - 添加项目 - 新建项目 创建一个新的Windows应用程序 命名为TestTimeLabel 并添入当前解决方案中 如图

   .添加控件引用

  在使用自定义控件之前 我们必须把控件添加到 工具箱 中 方法是 右击 工具箱 点选 自定义工具箱 在弹出的 自定义工具箱 对话框中选择 NET框架组件 页 然后点击 浏览 定位并打开我们刚才所创建的TimeLabel控件专有程序集(TimeLabel dll) 使该控件出现在 NET框架组件 列表中 如图 所示

  点击 确定 即可把TimeLabel控件添加到 工具箱 中 如图 所示

   .使用控件

  现在 我们就可以把我们创建的TimeLabel像其它控件一样拖放到Windows窗体上 设置它的属性和响应它的事件了 比如 可以在属性窗口中设置TimeLabel的LabelBackColor为你喜欢的颜色 当然 除LabelBackColor以外 还有大量的属性可供设置 而且如果大家愿意 还可以回到TimeLabel项目中再用上面说过的方法增加其它的属性 从而使控件功能和用户界面更加丰富

   .响应事件

  前面我们给TimeLabel增加了一个Tick事件 每当时间显示改变之后发生 那么我们的程序怎样知道Tick事件已经发生 并对它做出反应呢?方法如下 首先增加事件处理过程如下(名称可以自定 但必须要有object和EventArgs类型的参数 并且以void类型返回) private void TickHandler(object sender EventArgs e) { System Diagnostics Debug WriteLine(timeLabel LabelText); } 其次 在Form InitializeComponent过程中把上述过程注册给TimeLabel的Tick事件 this timeLabel Tick+=new EventHandler(this TickHandler); 这样 我们的试验项目就已经完成 可以调试了 试验程序启动界面如图

lishixinzhi/Article/program/net/201311/13228

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式