Wiard控件讲解
- 格式:doc
- 大小:274.00 KB
- 文档页数:14
Wizard控件的使用Wizard控件的使用分类: AspDotNet2008-11-08 15:11 2005人阅读评论(6) 收藏举报Wizard控件的使用:Wizard控件使用多个步骤来描绘用户的输入信息,该控件内的每个步骤均会给一个StepType。
可以在当步骤到Complete时,对所有的数据进行处理。
事件:需要隐藏信息的时候,可以在中间步骤中使用WizardStepChanged事件,其它的事件如点击完成、取消、下一步和上一步的时候的事件等。
TemplateWizardStep,提供一个允许用户自定义模板生成步骤的方法。
对它的访问,不能通过像其它步骤一样的直接访问方式,二是要通过它的模板ID来访问。
所以,如果在Wizard中的步骤采用这个方式,访问数据的时候,要注意。
下边看看一般的做法:拖控件到设计视图,点击智能标签的Auto Format为其设置格式。
这里采用彩色型,Colorful。
然后是添加步骤,在智能标签中选择:Add/Remove WizardSteps...,如图:步骤中的title表示名字,其余的,AllowReturn:是否运行步骤间通信,EnableTheming:是否允许使用主题,EnableViewState:是否允许保存往返信息,SkinID:使用的皮肤ID,StepType有好几种,一般来讲,Auto会自动检测为开始步骤还是中间步骤,但是完成步骤一定要手动选择Complete。
在这里,第三步,我们使用了一个由模板步骤(TemplatedWizardStep)自定义的步骤,由于访问它的数据,需要通过其ID 来访问,使用设置ID为mb。
如图:在完成步骤,手动选择Complete,如图:完成后,步骤算是添加好了,但是每一步骤还没有具体内容。
首先解决向导的字体太小的问题。
将Wizard控件拖大,但是,这个时候,发现左边的导航和右边的内容同时增大,需要将SideBarStyle下的Width属性指定宽度,根据具体情况而指定,这里指定100px。
MultiView 和View Web 服务器控件概述发送反馈MultiView和View Web 服务器控件用作其他控件和标记的容器,并提供了一种可方便地显示信息的替换视图的方式。
本主题包括:方案背景代码示例Class Reference方案可以使用MultiView和View控件执行如下任务:根据用户选择或其他条件提供备选控件集。
例如,您可能允许用户从一个源(feed) 列表中选择,其中每个源都在独立的View控件中配置。
然后可以显示包含用户选择的源的View控件。
可以使用MultiView和View控件作为创建多个Panel控件的一种替代方法。
创建多页窗体。
MultiView和View控件可以提供与Wizard控件相似的行为。
Wizard 控件尤其适合于创建用户分步骤填写的窗体。
Wizard控件还支持更多内置UI 元素(如页眉和页脚)、“上一页”和“下一页”按钮以及模板。
如果要创建根据条件(而不是按顺序)更改的显示,或者不需要Wizard控件支持的额外功能,则可以使用MultiView控件来代替Wizard。
返回页首背景MultiView控件用作一个或多个View控件的外部容器。
View控件又可包含标记和控件的任何组合。
MultiView控件一次显示一个View控件,并公开该View控件内的标记和控件。
通过设置MultiView控件的ActiveViewIndex属性,可以指定当前可见的View控件。
呈现View 控件内容未选择某个View控件时,该控件不会呈现到页面中。
但是,每次呈现页面时都会创建所有View控件中的所有Web 服务器控件的实例,并且将这些实例的值存储为页面的视图状态的一部分。
无论是MultiView控件还是各个View控件,除当前View控件的内容外,都不会在页面中显示任何标记。
例如,这些控件不会以与Panel控件相同的方式来呈现div元素。
这些控件也不支持可以作为一个整体应用于当前View控件的外观属性。
Wizard 使用简单教程杰赛网络优化部:林明烽一、 建立一个新工程 工程基本数据:无线参数:技术参数数据整个工程的基本数据概要:新建工程完成:二、 导入地图 注:地图的边界越大,生成的地图数据也大。
所以预测前须合理的定义地图边界,请参考本节第3点(合理的定义地图边界)。
地图的原始格式:1. 更改工程的经纬度格式:2. 导入地形(terrain)数据Import地图数据Bin的计算输入East – West 和 North – South 的值:Load地图:3. 合理的定义地图边界地图的精度越高,生成的地图也大。
所以可先导入低数据精度的地图,已确定地图的合理精度,在导入正确精度的地图。
即在进行bin计算时,把地图的精度设置比实际地图的精度低数倍,如下图显示地图。
参考本章第2点(导入地形(terrain)数据。
更新地图的边界:地图的边界更新了:显示地图:保存整个工程。
4. 合理导入地形(terrain)数据确定地图的边界后,把Bin的计算按地图的实际精度输入进行计算,输入正确的East – West 和 North – South 的值,再重新倒入地形的数据(Import-)load)。
参考本章节第2点。
5. 合理导入地貌(Clutter)数据导入过程和导入地形(terrain)一样,请参考本章节第2点。
(1) 在Import过程中不同的是,如下图所示:(2) 在Load的过程中,不同的是如下图所示;三、 编辑基站数据选中Add site的功能键,在项目框内点击就可以新增一个站点了。
编辑基站参数:应用到的基站数据库包括三个文件:* .cel; * .tx; * .cdma2000。
对应如下图所示:*.cdma2000参数的编辑,其他的参数值可为默认值:*.tx文件其他参数的编辑:选择天线:*.cdma2000参数的编辑,参考上面。
链路预算:再Tx中增加3dB的馈线损耗,点击Add Component。
ATL开发复合控件1 创建工程框架1.1 创建工程框架(测试环境VC6。
0)首先得用A TL COM AppWizard向导创建一个控件框架,工程名为DemoAltControl,(如图1所示)(图1)1.2 然后点周[OK],进入项目参数设置界面,对于习惯MFC的朋友,大家给选择Supper MFC这个项(如图2所示)图21.3项目参数设置为完成点击[Finish]图31.4 项目列出所要生成的文件1.5项目为我们生成的文件如下图显示2 项目控件对象下面为我们,我们的项目控件对象2.1 选择菜单[Inert ->New A TL Object],弹出A TL Object Wizard 对话框。
2.2 从左边的Category(类别)列表中选择Controls(控件),然后选择Composite Control2.3 单击[Next]按钮弹出由四个属性页组成的A TL Object Wizard 对话框,在这里我们可以对即将创建的组件进行设置,在Name页中的Short Name 字段输入xulu向导将同步为我们设定该对象的类名,CPP文件名,头文件名,和主接口名,同时还有在注册表表中的类型名以及ProgID等等,如上图所示2.4在Attributes中属性页中选择支持Support Connection Points(连接点)选项让向导加入支持事件的代码(这个事件尤其重要)2.5 在Stock Properties属性页中对库存属性进行添加,(本文为了方便只添加了一个属性)2.6 单调[确定] 关闭A TL Object Wizard 完成控件的设置2.7 看看伟大的向导为我们生产了什么?如下图所示接口类Ixulu ,事件类_IxuluEvents2.8 我们先看一下到此为止我们做了什么东西,选择运行我们选择ActivesControl Test Contaniner 打开VC6自带测试程序在界面单击鼠右键选择插入Inert New Control选择我们刚才创建项目接口”xulu Class”然后选择[ok]测试程序将插入这个控件如下图所示,就是向导为我们做的3 添加控件3.1 为我们在VC工程中选择,资源视图,选择Dialog 下的IDD_XULU 这里创建接口时向导为我们创建的,我们在这里添加控件,首先,调整一下,这个容器的大小,使用满足我们的需要3.2为控件添加一个按钮住窗口中拖一个按钮我就不多说了吧^,^3.2 为按钮添加一个消息事件在类视图中选择CXulu右键选择“add windows Message Handler“然后选择IDC_TEST_BUTTON,再选择BN_CLICKED,然后点[add and edit]3.3为刚才生成的事件添加测试代码LRESULT OnClickedTest_button(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) {// TODO : Add Code for control notification handler.::AfxMessageBox("hello ");return 0;}然后运行我们测试一下效果4 改控件的背景4.1 这次同样选择CXulu类鼠标右键选择“add windows Message Handler“,这次我们选择CXulu 为其添加WM_PAINT事件然后“add and edit”向导为我们添加也如下代码LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {// TODO : Add Code for message handler. Call DefWindowProc if necessary.return 0;}我们更改一下这个函数,为其添加代码LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {if ( ! IsIconic() )//无它会CPU会到100%{m_clrBackColor=123;//这里背景PAINTSTRUCT ps;HDC hDC = BeginPaint(&ps);RECT rcClient;GetClientRect(&rcClient);//use color, used by system for coloring titile barHBRUSH hbr=CreateSolidBrush(m_clrBackColor);FillRect(hDC,&rcClient,hbr);TextOut(hDC,0,0,"test textout ",strlen("test textout"));DeleteObject(hbr);EndPaint(&ps);bHandled=TRUE;}return 1;}4.2 运行一下,看看我们的测试效果4.3 因为我们前面已经加入了库存属性的背景色,所以我们可以不用写这行代码“m_clrBackColor=123;//这里背景”我们把它去掉测试一下我们使用[Edit]菜单下为更改控件的背景操作如下在菜单EDIT->Porperties。
第9章基本控件使用9.1 编辑框类9.1.1 编辑框类的结构及方法编辑框控件看起来是个非常简单的矩形窗口,但它具有许多功能。
编辑框控件有两种形式:单行编辑框控件和多行编辑框控件。
MFC在类Cedit中提供标准的Windows编辑框控件服务,Cedit是CWnd类直接派生来的,它具有CWnd的所有功能,其在MFC类库中的层次位置如下图:象大多数包含标准Windows控件的MFC类一样,Cedit类的结构比较复杂。
当创建Cedit 类的对象时,MFC自动赋予该对象一个标准的Windows编辑框控件,它定义了CEdit对象,其中包括方法原型。
CEdit类的定义源代码如P206所示。
9.1.2 编辑框类的应用实例例题:使用MFC AppWizard创建如下图所示的基于对话窗的应用程序,实现算术运算的计算器功能。
1.使用AppWizard建立应用程序框架2.使用资源编辑器建立对话框void CCalculatorDlg::OnButton1(){char aa[10],bb[10];double a,b,c;char cBuffer[50];m_a.GetWindowText(aa,10);m_b.GetWindowText(bb,10);a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中b=atof((LPCTSTR)bb);// L表示long指针,P表示指针,C表示常量,T表示Win32宏c=a+b;_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中m_c.SetWindowText(cBuffer);//UpdateData(FALSE);}void CCalculatorDlg::OnButton2(){char aa[10],bb[10];double a,b,c;char cBuffer[50];m_a.GetWindowText(aa,10);m_b.GetWindowText(bb,10);a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中b=atof((LPCTSTR)bb);// L表示long指针,P表示指针,C表示常量,T表示Win32宏c=a-b;_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中m_c.SetWindowText(cBuffer);//UpdateData(FALSE);}void CCalculatorDlg::OnButton3(){char aa[10],bb[10];double a,b,c;char cBuffer[50];m_a.GetWindowText(aa,10);m_b.GetWindowText(bb,10);a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中b=atof((LPCTSTR)bb);// L表示long指针,P表示指针,C表示常量,T表示Win32宏c=a*b;_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中m_c.SetWindowText(cBuffer);//UpdateData(FALSE);}void CCalculatorDlg::OnButton4(){char aa[10],bb[10];double a,b,c;char cBuffer[50];m_a.GetWindowText(aa,10);m_b.GetWindowText(bb,10);a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中b=atof((LPCTSTR)bb);// L表示long指针,P表示指针,C表示常量,T表示Win32宏c=a/b;_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中m_c.SetWindowText(cBuffer);//UpdateData(FALSE);}void CCalculatorDlg::OnButton5(){m_a.SetSel(0,-1);m_a.ReplaceSel("");m_b.SetSel(0,-1);m_b.ReplaceSel("");m_c.SetSel(0,-1);m_c.ReplaceSel("");//UpdateData(FALSE);}void CCalculatorDlg::OnButton6(){OnOK();}9.2 菜单类9.2.1 菜单菜单允许用户用一种标准的方法与Windows应用程序进行交互:一个样式一致的用户界面对象——菜单栏。
对话框来添加和修改学生基本信息,如图。
[例Ex_Ctrl6SDI] 创建并使用学生基本信息对话框(1)用MFC AppWizard(exe)创建一个默认的单文档应用程序Ex_Ctrl6SDI。
创建此对话框类为CStuInfoDlg。
(3)将[OK]和[Cancel]按钮的标题改为“确定”和“取消”。
(4)打开对话框网格,参看图的控件布局,为对话框添加如表所示的一些控件。
(1)打开ClassWizard的Member Variables页面,看看Class name是否是CStuInfoDlg,选中所需的控件ID号,双击鼠标。
依次为下列控件增加成员变量。
如表所示。
(2)为CStuInfoDlg类添加一个BOOL型成员变量m_bMale,并在CStuInfoDlg类设置该变量的初始值。
如下面的代码:CStuInfoDlg::CStuInfoDlg(CWnd* pParent /*=NULL*/): CDialog(CStuInfoDlg::IDD, pParent){m_bMale = FALSE;//{{AFX_DATA_INIT(CStuInfoDlg)…//}}AFX_DATA_INIT}代码中,//{{AFX_DATA_INIT(CStuInfoDlg)和//}}AFX_DATA_INIT之间的代码是控件变量的初始化代码,并由MFC ClassWizard自动管理。
(3)用MFC ClassWizard为CStuInfoDlg类添加WM_INITDIALOG消息映射,并添加下列初始化代码:BOOL CStuInfoDlg::OnInitDialog(){CDialog::OnInitDialog();// 设置单选按钮初始选中状态if (!m_bMale)CheckRadioButton(IDC_RADIO_MALE, IDC_RADIO_FEMALE, IDC_RADIO_FEMALE);elseCheckRadioButton(IDC_RADIO_MALE, IDC_RADIO_FEMALE, IDC_RADIO_MALE);// 这里对专业组合框进行初如化m_comboSpecial.AddString( "机械工程及其自动化" );m_comboSpecial.AddString( "电气工程及其自动化" );m_comboSpecial.AddString( "计算机科学" );m_strSpecial = "计算机科学";// 对出生年月初始化m_tBirth = CTime(1986, 1, 1, 0, 0, 0);UpdateData(FALSE);return TRUE; // return TRUE unless you set the focus to a control }(4)用MFC ClassWizard为单选按钮IDC_RADIO_MALE添加BN_CLICKED的消息映射,并增加下列代码:void CStuInfoDlg::OnRadioMale(){m_bMale = TRUE;}(5)用MFC ClassWizard为单选按钮IDC_RADIO_FEMALE添加BN_CLICKED的消息映射,并增加下列代码:void CStuInfoDlg::OnRadioFemale(){m_bMale = FALSE;}(6)用MFC ClassWizard为按钮IDOK添加BN_CLICKED的消息映射,并增加下列代码:void CStuInfoDlg::OnOK(){UpdateData();m_strName.TrimLeft();m_strNo.TrimLeft();if (m_strName.IsEmpty())MessageBox("必须要有姓名!");else if (m_strNo.IsEmpty())MessageBox("必须要有学号!");elseCDialog::OnOK();}(1)打开Ex_Ctrl6SDI单文档应用程序的菜单资源,添加顶层菜单项“测试(&T)”,在其下添加一个菜单项“学生基本信息(&U)”,ID为ID_TEST_STUINFO。
使用Windows标准控件我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。
在Visual C++中,可以使用的控件分成三类:(1) Windows标准控件Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。
所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。
Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。
表6.1 Windows标准控件续表6.1前面提到过,在MFC中,类CWnd是所有窗口类的基类,很自然的,它也是所有控件类的基类。
Windows标准控件在以下环境下提供:•Windows 95•Windows NT 3.51及以后版本•Win32s 1.3•注意:•Visual C++ 4.2及以后版本不再支持Win32s。
(2) ActiveX控件ActiveX控件可用于对话框中,也可用于HTML文档中。
这种控件过去被称为OLE 控件。
本书将在专门的章节中来讲述关于ActiveX控件的知识。
这里仅指出ActiveX控件使用了与标准控件完全不同的接口和实现方法。
(3) 其它MFC控件类除了Windows标准控件和自己编写的或者来自于第三方软件开发商的ActiveX 控件以外,MFC还提供了另外三种控件,它们由下面的三个类进行封装:•类CBitmapButton用于创建以位图作为标签的按钮,位图按钮最多可以包括四个位图图片,分别代表按钮的四种不同状态。
•类CCheckListBox用于创建选择列表框,这种列表框中的每一项前面有一个复选框,以决定该项是否被选中。
•类CDragListBox用于创建一种特殊的列表框,这种列表框允许用户移动列表项。
在本章我们仅讲述第一类控件,即Windows标准控件。
所涉及的内容包括各个控件的使用及相应的技巧。
17.1.2Wizard控件(1)Wizard控件远比MultiView控件更富魅力。
它同样支持每次显示几个视图中的一个,但它还包含一系列自定义的内建行为,包括导航按钮、带有分步链接的侧栏、样式和模板。
通常,向导表示一个任务,用户在其间进行线性移动,从当前步骤前进到下一步(或者在做更正时退回到上一步)。
的Wizard控件还支持非线性导航,也就是说,它允许你根据用户提供的信息忽略某些步骤。
默认情况下,Wizard控件提供导航按钮并在左边提供一个带有每个步骤链接的侧栏。
设置Wizard.DisplaySideBar属性为false可以隐藏侧栏。
一般情况下,当需要强制线性导航并阻止用户跳离固定的次序时,会用到这样的设置。
你可以用任意的HTML控件或 控件来提供每一步骤的内容。
图17-4显示了Wizard的编辑区域,你可以向已生成的Wizard实例添加内容。
1. 向导步骤在里创建向导,只需用<asp:WizardStep>标签定义它们的步骤和内容即可。
每个步骤都有一些基本信息。
表17-2显示了一些重要的属性。
表17-2向导步骤属性属性描述Title步骤的描述性名称。
这个名称用在侧栏作为链接显示的文字Step Type步骤的类型,它的值来自WizardStepType枚举。
这个值确定要为这个步骤显示的导航按钮的类型。
可选项包括Start(显示Next按钮)、Step(显示Next和Previous按钮)、Finish(显示Finish和Previous按钮)、Complete(不显示按钮,如果启用了侧栏也会把它隐藏)、Auto(步骤的类型按它在集合中的位置推断)。
默认值是Auto,它表示第一个步骤是Start,最后一个步骤是Finish ,所有其他步骤是StepAllo wReturn 表示用户是否可以重新回到这一步。
如果为false ,用户通过这一步之后,就再也不能返回这里。
侧栏里的链接对这个步骤不起作用,它的下一步骤的Previous 按钮要么跳过这一步,要么彻底隐藏(依赖于前一个步骤设置的AllowReturn 值)下面的向导包括四个步骤,它们一起组成一个问卷。
问卷结束时添加了Complete 步骤,它显示一些汇总信息。
导航按钮和侧栏链接是自动加入的。
图17-5显示了向导步骤。
和MultiView控件不同,在Visual Studio页面的设计界面里你每次只能看到一个步骤。
从智能标签里选择你要设计的步骤,如图17-6所示。
不过要注意--每次这样做的时候,Visual Studio会把Wizard.ActiveStepIndex改成当前你选择的步骤。
运行应用程序前一定要把它设为0,这样向导才会从第一步开始。
注解请记住,当你往向导的步骤中加入控件时,无论是哪一步骤,控件总会在视图状态中被实例化并持久化。
如果你希望简化复杂的向导,需要把它们分解到几个单独的页面里,使用Server.Transfer()方法从一个页面跳转到另一个,但同时要忍受一个并不美观的编程模型。
7.1.2Wizard控件(2)2. 向导事件你可以编写响应几个事件(如表17-3所示)的代码来增强你的向导。
表17-3向导事件事件描述ActiveStep Changed控件切换到一个新步骤时发生(也许是因为用户单击了导航按钮,也可能是因为代码修改了ActiveStepIndex属性)CancelButt onClickCancel按钮被单击时发生。
默认情况下不会显示Cancel按钮,但你可以设置Wizard.DisplayCancelBut ton属性把它添加到每一个步骤。
通常,单击Cancel按钮会退出向导。
如果你不需要执行任何清理代码,只要设置CancelDestinationPageU rl属性,向导就会自动执行重定向FinishButtonClickFinish按钮被单击时发生NextButto nClick和在任意步骤中,当Next按钮或Previous按钮被单击时发生。
不过,因PreviousB uttonClick 为有不止一种方式可以从一个步骤跳到下一个,所以最好是处理ActiveStepChanged事件SideBarBut tonClick侧栏区域里的按钮被单击时发生总体而言,有两种类型的向导编程模型。
逐步提交。
如果每个向导步骤包含一个不可回撤的原子操作,就应该采用逐步提交。
例如,如果你处理的订单信息涉及信用卡授权,在这之后是最终的购买,你就不能允许用户回退到上一步重新编辑信用卡号。
要支持这种模型,就需要把某些或所有步骤的AllowReturn 属性设为false,并且响应ActiveStepChanged事件为每个步骤提交变更。
最后提交。
如果向导的每个步骤是为最后要执行的操作收集数据,就应该使用最后提交。
例如,你正在收集用户信息并在获得所有信息后创建一个新账号,用户就很可能在整个过程中做一些修改。
你在向导结束时通过响应FinishButtonClick事件来执行创建新账号的代码。
要为当前示例实现最后提交,只要响应FinishButtonClick事件即可。
下例在汇总信息里显示了用户的所有选择:要让这段代码正常工作,你必须加入一个叫做lblSummary的Label控件。
在本例中,lblSummary被放置在最后的汇总步骤中。
提示如果你希望知道用户在向导里执行的是哪一个步骤,可以使用Wizard.GetHistory()方法。
它返回目前已经被访问的WizardStepBase对象集合,按时间反向排序。
也就是说,集合的第一项代表前一个步骤,第二项代表前一个步骤之前的那一个,等等。
3. 向导样式和模板毫无疑问,Wizard控件最强大的功能是允许你定制外观。
也就是说,如果你想要用基本模型(带有导航按钮和各种事件的多步过程),就不会受限于默认的用户界面。
根据你希望对向导外观修改程度的不同,你有不同的选择。
对于不大的修改,可以设置各种最上层的属性。
例如,和其他 控件一样,你可以控制颜色、字体、空格以及边框样式。
你还可以调整每个按钮的外观。
例如,要修改Next按钮,可以使用这些属性:StepNextButtonType(使用按钮、链接或可单击的图片)、StepNextButtonText(定制按钮或链接的文字)、StepNextButtonImageUrl(设置用于图片按钮的图片)、StepNextButtonStyle(使用样式表里的样式)。
你还可以通过HeaderText属性添加标题。
利用样式可获得更多控制。
就像你可以用样式格式化富数据控件(如GridView)的各个部分那样,你也可以用样式格式化Wizard 控件的各个部分。
表17-4列出了你可以使用的样式。
和其他基于样式的控件一样,样式冲突时,较具体的样式设置(如SideBarStyle)会覆盖一般的样式设置(如ControlStyle)。
类似地,在第一个步骤里,StartNextButtonStyle会覆盖NavigationButtonStyle。
表17-4向导样式样式描述ControlStyle作用于Wizard控件的所有区域HeaderStyle作用于Wizard控件的标题区域,它只在你设置了HeaderText属性后可见SideBarStyle作用于Wizard控件的侧栏区域SideBarButtonStyle只作用于侧栏里的按钮StepStyle作用于控件中你定义步骤内容的区域NavigationStyl e作用于控件的底部显示导航按钮的区域NavigationButt onStyle只作用于导航区域的导航按钮StartNextButto nStyle作用于第一个步骤里的“下一步”导航按钮(StepType为Start 时)StepNextButto nStyle作用于中间步骤的“下一步”导航按钮(StepType为Step时)StepPreviousB uttonStyle作用于中间步骤的“上一步”导航按钮(StepType为Step时)FinishPrevious ButtonStyle作用于最后一个步骤的“上一步”导航按钮(StepType为Finish时)CancelButtonS tyle如果你把Wizard.DisplayCancelButto n设为true,它作用于“取消”按钮最后,如果不能通过属性和样式达到你期望的自定义级别,还可以借助模板完全定义Wizard控件的外观。
通常,你只会为步骤的内容提供标记(如图17-1所示)。
通过使用模板,你还可以为其他区域提供标记,如标题、侧栏或者按钮。
所有的模板都是独立于步骤内容而声明的。
图17-7显示了Wizard控件中适合使用模板的地方。
表17-5显示了模板的完整列表。
表17-5向导模板样式描述HeaderTempla te定义标题区域的内容SideBarTempla te定义侧栏,它通常包含每个步骤的导航链接StartNavigatio定义第一个步骤的导航按钮nTemplate(当StepType 为Start 时)StepNavigationTemplate 定义中间步骤的导航按钮(当StepType 为Step时)FinishNavigationTemplate 定义最后一个步骤的导航按钮(当StepType 为Finish 时)例如,下面这个标题模板使用数据绑定表达式显示当前步骤的标题:还可以加入下列模板来定制导航按钮。
这个示例保留了标准按钮(通过显式声明)并加入了一些斜体文字,这样你可以看到每个模板什么时候在使用。
使用模板的秘决在于确保使用正确的命令名,这样Wizard控件可以关联到标准逻辑。
否则,你将不得不自己实现导航和排序的代码,它们冗长且易出错。
例如,单击一个命令名为MoveNext的按钮,会自动跳转到下一步。
如果你不太确信要使用什么样的命令名,可以借助一个方便的快捷方式。
在Visual Studio里选中Wizard控件,从智能标签中选择某个生成模板的链接,比如"转换为StartNavigationTemplate",此时Visual Studio会插入一个模板,这个模板会重现默认的按钮外观和行为。
注解可以毫无问题地在Wizard里使用验证控件。
如果验证控件发现了无效数据,它们将阻止用户单击侧栏的所有链接(跳到其他步骤里)并防止用户单击"下一步"按钮继续操作。
不过,默认情况下"上一步"按钮的CausesValidation属性被设置为false,也就是说用户将被允许回到前一个步骤。
如果这不是你希望的行为,那么可以创建自己的自定义模板并相应地设置控件的CausesValidation属性。