上一章节,我们已经大概知道如何对文件进行打包安装,不过我们也注意到,通过对Sample.wxs的编译链接,生成的msi安装包没有任何用户界面,只有一个安装进度条。下面我们来看看如何给安装包添加用户界面:
2.1 使用wix用户界面
wix本身自带有一套UI,使用这些UI我们可以满足大多数的安装界面要求,你可以决定到底使用哪种WixUI:
1、WixUI_Mondo 包含WixUI附带的全部用户界面:welcome界面,许可协议,安装类型(经典、自定义、完全),部件定制(安装类型自定义),浏览目标目录,磁盘消耗,同时也包含维护模式的界面;
2、WixUI_FeatureTree 与WixUI_Mondo的区别就是不能选择安装类型,许可协议界面之后直接到了部件定制界面;
3、WixUI_InstallDir 不会出现选择安装类型和自定义部件的界面,许可协议之后会进入到选择安装目录界面
4、WixUI_Minimal 简化的安装界面,在欢迎和许可协议后会自动安装,不能自定义部件和安装路径
5、WixUI_Advanced 跟WixUI_Minimal 相似,可以一键直接安装,也允许定义部件和安装路径
要在安装程序中应用WixUI需要进行如下配置,首先在源文件Sample.wxs中添加UI的引用,UIRef标记可以放到Product或Fragment标签下:
<UIRef Id="WixUI_Mondo" />
<UIRef Id="WixUI_ErrorProgressText" />
WixUI_Mondo 是用户界面的引用,WixUI_ErrorProgressText则是安装进度文本,加上该语句后,在安装进度界面会显示安装进度的文字信息。另外还有一个FilesInUse对话框也很有用,如果安装过程中要修改的文件正在使用,则会挂起安装程序,并弹出文件正在使用的对话框,用户可以选择重试、忽略或者退出安装,使用FilesInUse对话框只需添加如下语句:
<DialogRef Id = "FilesInUse" />
需要注意的是如果使用WixUI_InstallDir 界面,则还必须额外定义一个标识为WIXUI_INSTALLDIR的Property。它的Value为安装目录的Directory的ID,这个ID必须是大写的
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
所有的WixUI的资源文件都包含在wix目录下的WixUIExtension.dll中,因此在链接的时候需要加上-ext WixUIExtension参数:
candle.exe -dVersion=1.0.0 Sample.wxs -out 1.0.0/
light.exe -ext WixUIExtension -out 1.0.0/Sample.msi 1.0.0/Sample.wixobj
2.2 部件(Feature )定制
执行生成的Sample.msi,我们就可以看到现在安装包中已经包含用户界面了,我们可以看看部件定制界面,也就是选择自定义安装时出现的界面,包括2个可选的子部件和一个父部件,这3个部件正是我们之前定义的Feature,我们来看看之前我们定义的Feature的属性:
Title属性是部件树中显示的部件名称;
Description 属性是点击部件节点时在右边文本框中显示的描述性文字。
ConfigurableDirectory属性很重要,它的值是我们之前定义的目录的引用INSTALLDIR,如果不设置该属性,将不能为部件选择安装路径;
Level是安装部件的条件等级,要理解它的含义,我们还必须知道Install level的概念:
Install level可以理解成是安装级别的level,而Feature level 则是部件级别的level。Install level的值对应于安装类型,在选择安装类型时,会对Install level赋值。对于典型安装(Typical)的Install level是3,选择典型安装的情况下Feature level小于等于3的Feature都将被安装;对于完全安装(Complete)的Install level是1000,选择完全安装的情况下Feature level小于等于1000的Feature都将被安装,因此一般情况下我们定义的level不要超过1000;Feature level 设置为0部件将不会被安装,也不会在部件定制时显示出来。
另外要注意的是Feature,如果我们我们在Feature下定义了Condition,则Condition的条件为true时的level值将覆盖Feature的Level值。Condition,顾名思义就是条件,wix中Condition有多种用法:可以定义在Component下,作为安装Component的条件;定义在Control下,作为ControlCondition的入口;定义在Fragment 或者 Product下,作为运行安装程序的入口;定义在Feature下,则作为Feature 条件的入口,如定义如下condition,则当TESTSUCCESS属性为1时,Feature level的属性将被重置为1000。
<Condition Level='1000'>TESTSUCCESS = "1"</Condition>
2.3 本地化配置
到这里我们有了安装界面,但大家会发现安装界面的文字都是英文的,下面我们来看如何对安装包进行本地化的操作。首先我们要准备一个你需要语言的资源文件,可以到http://www.tramontana.co.hu/wix/loc/index.php下载相关的资源文件;不过很可惜,这里只有繁体的资源文件WixUI_zh-tw.wxl,并没有我们想要的简体中文的资源文件,我们可以将WixUI_zh-tw.wxl下载到本地,然后将繁体翻译成简体;也可以点这里下载(里面包含wixUI和SqlExtension的中文资源文件)。
接着我们需要对源文件进行如下改动:
1、修改源文件编码格式为utf-8:
<?xml version="1.0" encoding="utf-8"?>
2、修改Product的Codepage和Language属性,对应中文的属性值是Codepage="936" Language="2052"。
3、修改Package对应 的属性Languages和SummaryCodepage为936和2052
然后编译源文件,最后在链接时需要使用-loc开关加载资源文件,如下:
candle.exe -dVersion=1.0.0 Sample.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
2.4 自定义界面元素
运行生成的安装文件,已经变成中文安装界面了。到这里我们发现,许可协议内容和界面风格都还是wix默认的,wix中这些界面元素的内容都是使用变量定义的,我们可以通过重定义变量的值来更改这些界面元素:
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
<WixVariable Id="WixUIBannerBmp" Value="banner.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="dialog.bmp" />
<WixVariable Id="WixUIExclamationIco" Value="exclamation.ico" />
<WixVariable Id="WixUIInfoIco" Value="information.ico" />
<WixVariable Id="WixUINewIco" Value="new.ico" />
<WixVariable Id="WixUIUpIco" Value="up.ico" />
这里的Value 值是目标文件的相对路径,在与wxs源文件相同的目录下,ID的值是目标文件的标识,不能改变。
到这里我们已经可以生成一个标准的安装界面了,后面我们还将看到如何生成自定义的安装界面,下一章我们将讨论如何自定义Action(Custom Action)