除了標準的安裝界面,如果我們要在安裝時需要提供一些額外的信息時,這時就需要自定義界面來顯示和錄入這些信息。
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