本文结合NUnit源码,简单地绍一下用户控件的属性与事件的定制,希望对大家有所帮助。
在"nunit.uikit.dll"项目中有TestSuiteTreeView.cs文件,该文件主要实现一个自定义的treeview控件,NUnit工具gui窗口中的树就继承自该控件。
1、定制属性:
在TestSuiteTreeView类中有如下代码:
[Category( "Behavior" ), DefaultValue( true )]
[Description("Indicates whether the tree context menu should include a run command")]
public bool RunCommandSupported
{
get { return runCommandSupported; }
set { runCommandSupported = value; }
}
[Category( "Behavior" ), DefaultValue( true )]
------ 当visual designer 按分类顺序模式显示时,在visual designer 的属性列表中,RunCommandSupported属性显示在Behavior类别中,且初始值为true;
[Description("Indicates whether the tree context menu should include a run command")]
------ 指定该属性在visual designer中显示时的描述;
显示效果如下:
2、定制事件(event):
下面主要介绍该树形控件中SelectedTestChanged事件的定制过程。
(1)、声明委托(delegate):
public delegate void SelectedTestChangedHandler( UITestNode test );
(2)、在类TestSuiteTreeView中定义事件event:
public event SelectedTestChangedHandler SelectedTestChanged;
(3)、接下来就要定制该事件的触发时机,这里重载了TreeView.OnAfterSelect方法,代码如下:
protected override void OnAfterSelect System.Windows.Forms.TreeViewEventArgs e)
{
if ( SelectedTestChanged != null )
SelectedTestChanged( SelectedTest );
base.OnAfterSelect( e );
}
即在OnAfterSelect事件触发时,首先判断有没有SelectedTestChanged 实例存在,如果有则按顺序调用,再调用基类方法。
显示效果如下:
(4)、此处给出该定制控件在TestUnit.cs中的的应用:
a、定义方法:
private void tests_SelectedTestChanged(UITestNode test)
{
if (SelectedTestsChanged != null)
{
SelectedTestsChangedEventArgs args = new SelectedTestsChangedEventArgs(test.Name, test.CountTestCases());
SelectedTestsChanged(tests, args);
}
}
b、创建SelectedTestChangedHandler实例,并与SelectedTestChanged 关联:
tests.SelectedTestChanged += new SelectedTestChangedHandler(tests_SelectedTestChanged);
当然这两步都可通过设计器中双击实现。
(5)、ok.
以上只是粗略地分析了一下定制自定义控件属性、事件的过程,一些细节可能还要自己去摸索,在下只是在看源码的同时写一点随笔,肯请指正;
大家在繁忙的工作之余,不防抽点时间去看看好的开源项目源码,相信一定有自己需要东西!!!