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="测试连接(&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="返回(&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" />
<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>
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的更多相关文章
- Wix打包系列(三)自定义Action(Custom Action)
原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...
- Wix打包系列(二)用户界面和本地化操作
原文:Wix打包系列(二)用户界面和本地化操作 上一章节,我们已经大概知道如何对文件进行打包安装,不过我们也注意到,通过对Sample.wxs的编译链接,生成的msi安装包没有任何用户界面,只有一个安 ...
- Wix打包系列(七) 添加系统必备组件的安装程序
原文:Wix打包系列(七) 添加系统必备组件的安装程序 我们知道在vs的打包工程中添加系统必备组件是一件很容易的事情,那么在wix中如何检测系统必备组件并在安装过程中安装这些组件.这里以.Net Fr ...
- Wix打包系列(五) 部署数据库
原文:Wix打包系列(五) 部署数据库 很多人在使用vs进行打包的时候,经常会为数据库部署的问题犯愁,即便是重写Installer类的方法,也不是很可靠方便,下面我们来看看在wix中如何部署数据库. ...
- Wix打包系列(一)如何使用wix制作安装程序
原文:Wix打包系列(一)如何使用wix制作安装程序 最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多.收费 ...
- Wix打包系列 (六)制作升级和补丁包
原文:Wix打包系列 (六)制作升级和补丁包 前面我们已经知道怎么制作一个完整安装包了,但我们的软件往往不能一次性就满足客户的需要,当客户需要我们给软件进行升级的时候,我们应该怎么做呢? 在这之前,我 ...
- Docker系列四: 使用UI管理docker容器
一.什么是Portainer? Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容 ...
- webpack项目如何正确打包引入的自定义字体?
一. 如何在Vue或React项目中使用自定义字体 在开发前端项目时,经常会遇到UI同事希望在项目中使用一个炫酷字体的需求.那么怎么在项目中使用自定义字体呢? 其实实现起来并不复杂,可以借用CSS3 ...
- webpack项目如何正确打包引入的自定义字体
webpack项目如何正确打包引入的自定义字体 一. 如何在Vue或React项目中使用自定义字体 在开发前端项目时,经常会遇到UI同事希望在项目中使用一个炫酷字体的需求.那么怎么在项目中使用自定义字 ...
随机推荐
- Oracle_Database_11g_标准版_企业版__下载地址_详细列表
Oracle_Database_11g_标准版_企业版__下载地址_详细列表 Oracle Database 11g Release 2 Standard Edition and Enterprise ...
- 由两代WIN8 Surface平板看微软心态
要说win8平板的前景非常好,微软的两代surface做的真不错. 可是可是,微软就错在了把价格定的太高.为什么高,一是intel芯价格不低,二是每套win8和office微软得要价几百美金吧! 这两 ...
- 自己用h5写的转盘。写贴上来吧。
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 不包含SDK头文件, 补全API定义
/// @file main.cpp /// @brief 不包含SDK头文件, 补全API定义 #ifdef __cplusplus extern "C" { #endif /* ...
- PHP学习之-1.4 计算表达式
计算表达式 不同于HTML和CSS,在PHP中做计算,比如我们写 echo 12*3 计算结果是36.代码如下 <?php echo 12*3;?> 实例 <!DOCTYPE HTM ...
- WPF的MVVM
一.关于WPF WPF(Windows Presentation Foundation) ,从名字来看,Microsoft想把WPF技术作为Windows程序外观(表现层)的基础.我们知道,现在开发 ...
- linux下nginx负载均衡部署
nginx负载均衡部署 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 server,也是一个 IMAP/POP3/SMTP 代理server. Ngi ...
- HDU4549 M斐波那契数
M斐波那契数列 题目分析: M斐波那契数列F[n]是一种整数数列,它的定义例如以下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 如今给 ...
- EasyUI - Draggable 拖动控件
效果: html代码: <div id="box" style="width: 400px; height: 200px; background-color: #f ...
- [置顶] PMBOOK第四版-ITO与数据流图总结
具体文档下载地址: 点击打开文档下载地址 :http://download.csdn.net/detail/lyjluandy/6694205 一.过程组与知识领域表(简图) 二.输入 - 工具 - ...