本文结合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.

 

以上只是粗略地分析了一下定制自定义控件属性、事件的过程,一些细节可能还要自己去摸索,在下只是在看源码的同时写一点随笔,肯请指正;

大家在繁忙的工作之余,不防抽点时间去看看好的开源项目源码,相信一定有自己需要东西!!!