Wix打包系列(四) 自定义UI

原文:Wix打包系列(四) 自定义UI

    除了标准的安装界面,如果我们要在安装时需要提供一些额外的信息时,这时就需要自定义界面来显示和录入这些信息。

   

    4.1  自定义对话框

    如上一章中我们测试数据库的连接串在源文件中定义的,如果我们需要用户安装时输入数据库信息,就需要添加一个如图的对话框。

    开始之前,我们先看看标准的WixUI_Mondo UI包含哪些对话框:

   1: BrowseDlg 
   2: CustomizeDlg 
   3: DiskCostDlg 
   4: LicenseAgreementDlg 
   5: SetupTypeDlg 
   6: WelcomeDlg 

    这些标准对话框都有Back和Next按钮,他们通过类似双向链表的方式连接起来,新添加的对话框需要插入到这个双向链表中;这里我们需要添加DbConfigDlg对话框,就需要重新定义链表的Back和Next节点。

    首先我们创建一个DbConfigDlg.wxs文件,文件内容如下:

<?xml version="1.0" encoding="utf-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"><Fragment><UI><Dialog Id="DBConfigDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes"><Control Id="DBNameLabel" Type="Text" X="45" Y="56" Width="200" Height="15" TabSkip="no" Text="数据库名称:" /><Control Id="DBNameEdit" Type="Edit" X="45" Y="71" Width="280" Height="15" Property="DBNAME" Text="{32}" /><Control Id="ServerLabel" Type="Text" X="45" Y="94" Width="200" Height="15" TabSkip="no" Text="服务器(名称或者IP地址):" /><Control Id="ServerEdit" Type="Edit" X="45" Y="109" Width="280" Height="15" Property="SERVERNAME" Text="{32}" /><Control Id="UserNameLable" Type="Text" X="45" Y="131" Width="280" Height="10" TabSkip="no"><Text>用户名:</Text></Control><Control Id="UserNameEdit" Type="Edit" X="45" Y="146" Width="280" Height="15" Property="DBUSERNAME" Text="{32}" /><Control Id="PasswordLabel" Type="Text" X="45" Y="169" Width="200" Height="15" TabSkip="no" Text="密码:" /><Control Id="PasswordEdit" Type="Edit" Password="yes" X="45" Y="184" Width="280" Height="15" Property="DBPASSWORD" Text="{32}" /><Control Id="TestConnect" Type="PushButton" X="45" Y="206" Width="66" Height="17" Text="测试连接(&amp;T)"><Publish Event="DoAction" Value="ConnectDB" Order="2" >1</Publish><Publish Event="SpawnDialog" Value="InvalidDBDlg" Order="3">1</Publish></Control><Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)"><Publish Event="NewDialog" Value="LicenseAgreementDlg">1</Publish></Control><Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)"><Condition Action="disable"><![CDATA[CONNECTSUCCESS <> "1"]]></Condition><Condition Action="enable">CONNECTSUCCESS = "1"</Condition><Publish Event="NewDialog" Value="SetupTypeDlg">1</Publish></Control><Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)"><Publish Event="SpawnDialog" Value="CancelDlg">1</Publish></Control><Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" /><Control Id="Description" NoWrap="no" Type="Text" X="25" Y="23" Width="280" Height="30" Transparent="yes" NoPrefix="yes"><Text>继续安装应用程序需要填写以下信息,确保数据库能够被正确安装,并且使应用程序能够在该数据库上运行。</Text></Control><Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" /><Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes"><Text>{/WixUI_Font_Title}数据库配置</Text></Control><Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" /></Dialog><Property Id="DBNAME" Value="test" /><Property Id="SERVERNAME" Value="(local)" /><Property Id="DBUSERNAME" Value="sa" /><Property Id="DBPASSWORD" Value="123456" /></UI></Fragment><Fragment><UI><Dialog Id="InvalidDBDlg" Width="250" Height="85" Title="[ProductName] [Setup]" NoMinimize="yes"><Control Id="Return" Type="PushButton" X="100" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="返回(&amp;R)"><Publish Event="EndDialog" Value="Return">1</Publish></Control><Control Id="ConnError" Type="Text" NoWrap="no" X="48" Y="15" Width="194" Height="30" TabSkip="no"><Text>数据库连接失败。</Text><Condition Action="show"><![CDATA[CONNECTSUCCESS <> "1"]]></Condition><Condition Action="hide">CONNECTSUCCESS = "1"</Condition></Control><Control Id="ConnYes" Type="Text" NoWrap="no" X="48" Y="15" Width="194" Height="30" TabSkip="no"><Text>数据库连接成功。</Text><Condition Action="show">CONNECTSUCCESS = "1"</Condition><Condition Action="hide"><![CDATA[CONNECTSUCCESS <> "1"]]></Condition></Control></Dialog></UI></Fragment></Wix>

    代码中一共有2个对话框,主要由Control组成,由Type属性区分Control类型。InvalidDBDlg对话框用来弹出连接提示信息;DbConfigDlg对话框接受用户录入的数据,包括文本框、输入框和按钮等;我们可以看到每个PushButton类型的Control都包含一个Publish标记,它定义了Event事件属性,Publish的Event属性值包含如下可能:

    1、DoAction ,表示按钮事件执行一个Action动作,value属性值是Action的标识

    2、NewDialog, 表示按钮事件将当前操作界面定位到新的界面,value属性值是界面的标识

    3、SpawnDialog,表示按钮事件将弹出一个模式对话框,value属性值是界面的标识

    4、如果Publish标记没有定义Event属性,则必须定义Property属性,但不可同时定义;定义Property属性表示按钮事件会给Property赋值,value属性值是给Property设置的值。

 

    我们来看看这些按钮的作用:

    TestConnect 按钮包含两个Publish事件,第一个事件是执行ConnectDB的Action,这个Action也就是我们上节定义的Action;它的第二个事件是弹出InvalidDBDlg对话框,提示连接数据库的提示信息。

    Back、Next、Cancel是安装界面的标准按钮,Back按钮的Publish事件将界面跳转到LicenseAgreementDlg欢迎界面;Next按钮的Publish事件将界面跳转到SetupTypeDlg 安装类型选择界面,Next按钮包含两个Condition条件,第一个Condition表示当CONNECTSUCCESS <> "1"时,Next按钮将被禁用,第二个Condition表示当CONNECTSUCCESS <> "0"时,Next按钮将被激活;Cancel的Publish事件将弹出CancelDlg对话框,CancelDlg对话框是windows installer内置的,用户可以选择是否终止或退出安装。

 

    Text和Edit类型的Control相当于我们熟悉的Lable和TextBox。不同的是,Edit编辑控件必须定义Property属性,这样我们在安装过程或者Action中都可以引用该Property值;需要注意的是,这里Property的值才能正确反映编辑框的值,而“Text="{32}”仅表示允许输入的文本框长度,如果想给Control赋初始值,通过Text设置是不起作用的,需要显示定义Property,如:

<Property Id="DBNAME" Value="master" />

    ConnError文本框的Condition表示只有在连接失败时才显示,ConnYes文本框的Condition表示只有在连接时时才显示。

   

     这样,新的对话框已经创建好了,我们还需修改下Sample.wxs,修改后的Product部分内容如下:

<Product ...>   

<Package .../>   

...

<Feature...>          ...        ...</Feature>

<Binary Id='ConnectDBClass' SourceFile='$(var.Version)/SampleCustomAction.CA.dll' />

<CustomAction Id='LaunchFile'  FileKey='filFoobarEXE' ExeCommand='' Return='asyncNoWait' /><CustomAction Id='ConnectDB' BinaryKey='ConnectDBClass' DllEntry='ConnectDataBase' />

<UI Id="MyWixUI_Mondo"><UIRef Id="WixUI_Mondo" /><UIRef Id="WixUI_ErrorProgressText" />

<DialogRef Id="DBConfigDlg" /><Publish Dialog="DBConfigDlg" Control="TestConnect" Property="CONNECTIONSTRING"Value="data source=[SERVERNAME];user=[DBUSERNAME];password=[DBPASSWORD];initial catalog=[DBNAME];Persist Security Info=;"Order="1" >NOT Installed</Publish>

<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="DBConfigDlg" Order="2">            LicenseAccepted = "1"</Publish><Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="DBConfigDlg">1</Publish>

<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="LaunchFile" Order="1">1</Publish></UI>

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />

</Product>  

 

    上面代码中我们自定义了一个UI标签MyWixUI_Mondo,把要引用的UI和界面元素都放到这个元素里,如果不定义新的UI标签的话,那么后面定义的Publish 事件就只能定义到DBConfigDlg.wxs的UI下面。DBConfigDlg对话框下定义了Back和Next的跳转的界面,但这还只定义了双向链表的其中一端,SetupTypeDlg的Back按钮和LicenseAgreementDlg的Next按钮行中定义链表的另一端,都跳转到DBConfigDlg界面。

 

    我们还为TestConnect按钮添加一个Publish 事件,这个事件用来给CONNECTIONSTRING赋值,Value属性中可以直接引用其他属性的值(用方括号引起来),它的Order等于1,而ConnectDB的Order等于2,说明在ConnectDB之前执行;我们这里只阐述一种用法,对于设置连接串也可以不这么写,一般我们可以在'ConnectDB'方法中 中获取输入的数据库连接串的属性然后生成连接串。

 

    最后,我们需要在编译和链接时候添加DBConfigDlg对话框:

 

candle.exe -dVersion=1.0.0  1.0.0/Sample.wxs DbConfigDlg.wxs -out 1.0.0/light.exe -loc WixUI_zh-cn.wxl  -ext WixUIExtension -out 1.0.0/Sample.msi 1.0.0/Sample.wixobj 1.0.0/DbConfigDlg.wixobj 

 

    我们可以看到wix中允许为任何UI(包括windows installer内置的UI、wixUI和自定义UI)的Control添加事件处理的方法,这样我们就可以更方便的控制安装流程。下一章节我们将介绍如何如何在安装时部署数据库。

时间: 2024-11-16 11:56:18

Wix打包系列(四) 自定义UI的相关文章

Wix打包系列(三)自定义Action(Custom Action)

原文:Wix打包系列(三)自定义Action(Custom Action)    3.1 关于Action     我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面设置使用标准的安装步骤进行安装,它的安装过程是由一系列标准的Action组成,通过这些Action来完成对计算机的安装配置:如果我们想自定义安装步骤或者在安装过程中执行自定义的操作,就需要使用自定义的Action.当然,使用Custom Action之前,我们应该先了解一下msi中这些

iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局

iOS流布局UICollectionView系列四--自定义FlowLayout进行瀑布流布局 一.引言         前几篇博客从UICollectionView的基础应用到设置UICollectionViewFlowLayout更加灵活的进行布局,但都限制在系统为我们准备好的布局框架中,还是有一些局限性,例如,如果我要进行瀑布流似的不定高布局,前面的方法就很难满足我们的需求了,如下: 这种布局无疑在app的应用中更加广泛,商品的展示,书架书目的展示,都会倾向于采用这样的布局方式,当然,通过

Wix打包系列(七) 添加系统必备组件的安装程序

原文:Wix打包系列(七) 添加系统必备组件的安装程序     我们知道在vs的打包工程中添加系统必备组件是一件很容易的事情,那么在wix中如何检测系统必备组件并在安装过程中安装这些组件.这里以.Net Framework组件作为必备组件为例:         7.1 检测.Net Framework 版本         步骤1:为安装项目添加WiX .NET extensions库的引用     如果是命令行方式使用wix,那么需要在candle和light的时候添加如下参数: -ext W

Wix打包系列(一)如何使用wix制作安装程序

原文:Wix打包系列(一)如何使用wix制作安装程序     最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多.收费的商业打包工具不在我考虑范围内,于是在网上找到了wix,稍微了解了下,发现wix的确可以满足我的需求:但是网上wix中文的资料少的可怜,百度,google上搜索到关于wix中文的资料少的可怜,有的只是一些简单的应用,还不足以满足我的要求:没办法,只能靠自己了,还好项目不是很急,于是开始花时间

Wix打包系列(五) 部署数据库

原文:Wix打包系列(五) 部署数据库     很多人在使用vs进行打包的时候,经常会为数据库部署的问题犯愁,即便是重写Installer类的方法,也不是很可靠方便,下面我们来看看在wix中如何部署数据库.         5.1 创建数据库         wix包含数据库的相关链接库,需要为wix添加如下命名空间: <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util='http://schemas.

Wix打包系列 (六)制作升级和补丁包

原文:Wix打包系列 (六)制作升级和补丁包     前面我们已经知道怎么制作一个完整安装包了,但我们的软件往往不能一次性就满足客户的需要,当客户需要我们给软件进行升级的时候,我们应该怎么做呢?       在这之前,我们有必要了解下Windows Installer中的Upgrades定义:       6.1 关于Windows Installer Upgrades       在Windows Installer中将软件产品的更新划分为3类: Small updates    它意味着安装

Android UI设计系列之自定义ListView仿QQ空间阻尼下拉刷新和渐变菜单栏效果(8)_Android

好久没有写有关UI的博客了,刚刚翻了一下之前的博客,最近一篇有关UI的博客:Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7) ,实现各种风格效果的对话框,在那篇博客写完后由于公司封闭开发封网以及其它原因致使博客中断至今,中断这么久很是惭愧,后续我会尽量把该写的都补充出来.近来项目有个需求,要做个和QQ空间类似的菜单栏透明度渐变和下拉刷新带有阻尼回弹的效果.于是花点时间动手试了试,基本上达到了QQ空间的效果,截图如下:         通过观察QQ空间的运行效果,发现

BootStrap智能表单实战系列(四)表单布局介绍_javascript技巧

什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 表单的布局分为自动布局和自定义布局两种: 自动布局就是根据配置项中第二级配置项中数组的长度来自动使用不同的bootstrap栅格,通过设置autoLayout为true可以实现自动布局 自动以布局就是根据autoLayout来决定使用的栅格,通过设置autoLayout:'1,2,1,2,2,4' 表示 第一.二列占3格

iOS开发UINavigation系列四——导航控制器UINavigationController

iOS开发UINavigation系列四--导航控制器UINavigationController 一.引言         在前面的博客中,我么你介绍了UINavigationBar,UINavigationItem和UIToolBar,UINavigationController是将这些控件和UIViewController紧密的结合了起来,使用导航,我们的应用程序层次会更加分明,对controller的管理也更加方便.前几篇博客地址如下: UINavigationBar:http://my