演练:使用 Visual C# 创作用户控件
Visual Studio .NET 2003
用户控件提供了一种创建和重用自定义图形界面的方法。用户控件本质上是具有可视化表示形式的组件。因此,它可能包含一个或多个 Windows 窗体控件、组件或代码块,它们能够通过验证用户输入、修改显示属性或执行作者所需的其他任务来扩展功能。可以按照与其他控件相同的方式,将用户控件置于 Windows 窗体中。在本演练的第一部分,创建一个名为 ctlClock 的简单用户控件。在本演练的第二部分通过继承扩展 ctlClock 的功能。
创建项目
创建新的项目时应指定其名称,以设置根命名空间、程序集名称和项目名称,并确保默认组件将位于正确的命名空间中。
创建 ctlClockLib 控件库和 ctlClock 控件
1. 在“文件”菜单上,指向“新建”,然后选择“项目”以打开“新建项目”对话框。
2. 从“C# 项目”列表中选择“Windows 控件库”项目模板,然后在“名称”框中键入 ctlClockLib。
注意 “Windows 控件库”模板在 Visual C# .NET 的标准版中不可用。有关更多信息,请参见 Visual C# 标准版的功能。
默认情况下,项目名称 ctlClockLib 也被分配到根命名空间中。根命名空间用于限定程序集中的组件名。例如,如果两个程序集都提供名为 ctlClock 的组件,则可以使用 lClock 指定 ctlClock 组件。在解决方案资源管理器中,右击“UserControl1”并从快捷菜单中选择“查看代码”。
3. 到 Class 语句 public class UserControl1,将 UserControl1 更改为 ctlClock 以更改组件的名称。
注意 默认情况下,用户控件从系统提供的 UserControl 类继承。UserControl 类提供所有用户控件要求的功能,并实现标准方法和属性。
4. 到构造函数 public UserControl1(),将 UserControl1 更改为 ctlClock。
5. 在解决方案资源管理器中,单击“UserControl1”,然后在“属性”窗口中,将 FileName 属性更改为 ctlClock.cs。
6. 从“文件”菜单中,选择“全部保存”来保存项目。
将 Windows 控件和组件添加到用户控件
可视化界面是用户控件的基本部分。这种可视化界面是通过将一个或多个 Windows 控件添加到“用户控件设计器”中实现的。在下面的演示中,将向用户控件中加入 Windows 控件,并编写代码以实现功能。
将标签和计时器添加到用户控件中
1. 在解决方案资源管理器中,右击“ctlClock.cs”,然后选择“视图设计器”。
2. 在工具箱中,单击“Windows 窗体”选项卡,然后双击 label。
名为 label1 的标签控件被添加到用户控件设计器上的控件中。
3. 在设计器中,单击 label1。在“属性”窗口中,设置下列属性。
属性 | 更改为 |
Name | lblDisplay |
Text | (空白) |
TextAlign | MiddleCenter |
Font.Size | 14 |
4. 在“工具箱”中,单击“Windows 窗体”,然后双击“计时器”。
因为计时器是个组件,所以它在运行时没有可视化的表示形式。因此,它不与其他控件一起出现在“用户控件设计器”上,而是出现在组件栏中。
5. 在组件栏中,单击 timer1,并将 Interval 属性设置为 1000,将 Enabled 属性设置为 true。
Interval 属性控制计时器组件的刻度频率。timer1 每走过一个刻度,它都会运行一次 Timer1_Tick 事件中的代码。interval 表示前后两次刻度之间的毫秒数。
6. 在组件栏中,双击 timer1 以转到 ctlClock 的 timer1_Tick 事件。
7. 将该代码修改为类似如下所示的代码示例。请确保将访问修饰符从 private 更改为 protected:
复制
protected void timer1_Tick(object sender, System.EventArgs e)
{
// Causes the label to display the current time
lblDisplay.Text = DateTime.Now.ToLongTimeString();
}
这些代码将使得当前时间显示在 lblDisplay控件的使用 中。因为 timer1 的间隔设置为 1000,所以该事件每隔 1000 毫秒激发一次,从而每隔一秒就更新一次当前时间。
8. 用 virtual 关键字修改该方法使其可重写。有关更多信息,请参见本主题的下一节“从用户控件继承”。
复制
protected virtual void timer1_Tick(object sender, System.EventArgs e)
9. 从“文件”菜单中,选择“全部保存”来保存项目。
将属性添加到用户控件中
现在,clock 控件封装了 Label 控件和 Timer 组件,每个都有其自己的继承属性组。尽管
您的控件的后续用户无法访问这些控件的个别属性,但可以通过编写适当的代码块来创建和公开自定义属性。在下面的章节中,您将向控件中添加属性,这些属性使用户能够更改背景和文本的颜。
将属性添加到用户控件中
1. 在解决方案资源管理器中,右击“ctlClock.cs”,然后从快捷菜单中单击“查看代码”。
控件的代码编辑器打开。
2. 到 public class ctlClock 语句。在开始的 { 后面,键入:
复制
private Color colFColor;
private Color colBColor;
这些语句会创建私有变量,用来存储要创建的属性的值。
3. 在步骤 2 中的变量声明下方键入以下代码:
复制
// Declares the name and type of the property.
public Color ClockBackColor
// Retrieves the value of the private variable colBColor.
{
get
{
return colBColor;
}
// Stores the selected value in the private variable colBColor, and
// updates the backcolor of the label control lblDisplay.
set
{
colBColor = value;
lblDisplay.BackColor = colBColor;
}
}
// Provides a similar set of instructions for the forecolor.
public Color ClockForeColor
{
get
{
return colFColor;
}
set
{
colFColor = value;
lblDisplay.ForeColor = colFColor;
}
}
前述的代码使两个自定义属性(ClockForeColor 和 ClockBackColor)可用于该控件后面的用户。Get 和 Set 语句提供属性值的存储和检索,以及提供实现适合于属性的功能的代码。
4. 从“文件”菜单中,选择“全部保存”来保存项目。
测试控件
控件不是独立的应用程序,它们必须寄宿在容器中。为了测试控件,必须提供一个在其中运行该控件的测试项目。在本节中,将生成控件并在 Windows 窗体中测试它。
生成控件
∙ 在“生成”菜单上单击“生成”。
创建测试项目
1. 在“文件”菜单上,指向“添加项目”,然后单击“新建项目”以打开“添加新项目”窗口。
2. 单击“Windows 应用程序”,然后在“名称”框中,键入 Test。
3. 在解决方案资源管理器中,右击测试项目的“引用”节点。单击“添加引用”,显示“添加引用”对话框。
4. 单击标记为“项目”的选项卡。用户控件项目将在“项目名称”下列出。
5. 双击您的项目。
注意,此时该项目显示在“选定的组件”窗口中。
在添加引用之后,可以将控件置于您的窗体中。
测试控件
1. 在“工具箱”中,单击“我的用户控件”,然后向下滚动,直到显示表示 ctlClock 的控件图标为止。
2. 双击 ctlClock 图标。
现在,您的控件的副本被添加到窗体中。请注意,它显示当前时间,并且每秒更新一次。
3. 在工具箱中,选择该图标,然后将鼠标移动到您的窗体上。
4. 按住鼠标左键,同时在窗体上移动鼠标。
控件的另一个副本被拖放到窗体上。可以根据需要将任意数目的计时器副本添加到您的窗
体上。
5. 在设计器中,单击 ctlClock 的实例之一。
该实例的属性显示在“属性”窗口中。
6. 在“属性”窗口中,到 ClockBackColor 属性,然后选择属性以显示调板。
7. 通过单击某个颜来选择它。
控件的背景颜更改为您选择的颜。
8. 使用类似的事件序列来验证 ClockForeColor 属性的功能是否与预期的一样。
在本节中,您已经知道组件和 Windows 控件如何与代码和打包结合,以用户控件的形式提供自定义功能。您已经学会在用户控件中公开属性,以及如何在完成后测试控件。在下一节中,您将学习如何将 ctlClock 用作基来构造继承的用户控件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论