2007年8月30日星期四

第四章 如何使用UIExtensionSites

UIExtensionSite菜单项(MenuItem)菜单工具栏(Menu strips)按钮按钮工具栏(Toolbar Strips)下面的篇幅中,将要介绍如何使用UIExtensionSite: 步骤:

添加一个UIExtensionSite

  • 注册UIExtensionSite
  • 添加一个界面元素到UIExtensionSite中
  • 绑定到一个Command
  • 书写Command处理函数
  • 一、添加一个UIExtensionSite

    在这个例子中,我们添加一个ToolbarStrips类型的UIExtensionSite。打开ShellLayoutView或ShellForm(取决于是否在创建SmartClient工程的时候创建Layout项目),在Toolbox中选中ToolStrip,添加到Designer中,打开属性,在Dock中选中Top,修改Name为“ButtonsBar”。

    在Infrastructure.Interface项目中,打开Constants.UIExtensionSiteNames类,添加如下代码:

    public const string ButtonsBar="ButtonsBar"

    将ButtonsBar的名字定义为常量,在UIExtensionSiteNames中,所有的常量必须唯一。在SmartClient中,是以名字作为一个UIExtensionSite唯一标识的。

    二、注册UIExtensionSite

    下面的代码用来注册一个UIExtensionSite

    WorkItem.UIExtensionSites.RegisteSite(UIExtensionSiteNames.ButtonsBar, this.View.ButtonsBar);

    可以将上述代码加到ShellLayoutViewPresenter类的OnViewSet()方法中或加到ShellApplication类的Run方法中(取决于是否在创建SmartClient工程的时候创建Layout项目)。

    三、添加一个界面元素到UIExtensionSite中

    打开ModuleController.cs,在ExtendToolStrip方法中将一个定义好的按钮加入先前定义好的ButtonsBar中。

    ToolStripButton element = new ToolStripButton()

    //add code here to inital element.

    WorkItem.UIExtensionSites[Constants.UIExtensionSiteNames.ButtonsBar].Add(new ToolStripButton());

    到目前为止,我们已经将一个按钮加到一个UIExtensionSite中,下一步我们将介绍如何使加入的按钮响应鼠标点击事件,并调用相应的方法。

    四、将鼠标响应事件绑定到一个Command

    在CAB中,我们可以使用Command模式来实现事件响应,打开新建模块的Constants.CommandNames类,在该类中,将该按钮鼠标响应事件命令名定义为一个常量:

    public const string TestButtonClick= "TestButtonClick";

    在ModuleController类中的ExtendToolStrip方法中,加入如下代码:

    WorkItem.Commands[Constants.CommandNames.TestButtonClick].AddInvoker(element, "Click");

    下面我们将介绍如何将Command绑定到一个方法

    五、书写Command处理函数

    在CAB中,我们使用AOP来实现Command方法绑定

    [CommandHandler(CommandNames.TestButtonClick)]
    public void OnTestButtonClick(object sender, EventArgs e)
    {
         MessageBox.Show("Successful");
    }

    CommandHandler是CAB中预订义的Attribute,用来申明事件处理方法。

    后续:

    当我们将模块相关的界面元素加到UIExtensionSite中时,如果每个模块自己添加的话,这要求每个模块开发人员需要了解Infrastructure模块的一些细节设计和实现,这对于一个大型应用开发来说是降低效率的,同时也会有很多的冗余代码。因此,我们可以将Infrastructure中的实现细节进行封装,以接口的形式暴露给各个模块,这样业务模块开发人员可以只关心自己本身的业务需求开发,而不用关心基础模块的具体实现,也减少出错的可能。

    没有评论: