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添加事件處理的方法,這樣我們就可以更方便的控制安裝流程。下一章節我們將介紹如何如何在安裝時部署數據庫。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章