[wix-users] More Advanced WiX Bootstrapper UI [P]

Steven Ogilvie Steven.Ogilvie at titus.com
Tue Aug 4 11:11:24 PDT 2015

Classification: Public
I have modified  the theme files so I get a "welcome" screen where I can select my companies applications to install, via combo boxes, select next which displays a RTF for the EULA, then click install to actually install the product

So I have a Client product, that has 3 client applications...
I have pre requisite software that I set up in the Bundle.wxs to install and I have 3 check boxes for the 3 client applications.
I install those applications based on the check box selection...

So I have a bundle.wxs file, a theme file that I modified to use the options page as the "EULA" page, and the "localization" file to contain my strings

i.e. in the Bundle.wxs:
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <Payload SourceFile="$(var.scSourcePath)\SideBanner.png" Compressed="yes" />
      <Payload SourceFile="$(var.scSourcePath)\end-user license.png" Compressed="yes" />
      <Payload SourceFile="$(var.scSourcePath)\Background.png" Compressed="yes" />
<Variable Name="InstallClient1Checkbox" Type="numeric" bal:Overridable="yes" Value="1" />
    <Variable Name="InstallClient2Checkbox" Type="numeric" bal:Overridable="yes" Value="1" />
    <Variable Name="InstallClient3Checkbox" Type="numeric" bal:Overridable="yes" Value="1" /> ...

<MsiPackage Id="K_MainInstall_x64"
                  DisplayName="$(var.Prod1_ProductName) x64"
                  InstallCondition="InstallClient3Checkbox = 1 AND VersionNT64"
        <MsiProperty Name="RESTART_EXPLORER" Value="[RESTART_EXPLORER]"/>
        <MsiProperty Name="MSI_RUN_FROM_EXE" Value="[MSI_RUN_FROM_EXE]"/>
        <MsiProperty Name="SERVICESLOGLEVEL" Value="[SERVICESLOGLEVEL]"/>

And in the theme file:
<?xml version="1.0" encoding="utf-8"?>
<Theme xmlns="http://wixtoolset.org/schemas/thmutil/2010">
  <Window Width="500" Height="390" HexStyle="100a0000" FontId="0">#(loc.Caption)</Window>
  <Font Id="0" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
  <Font Id="1" Height="-24" Weight="500" Foreground="000000">Segoe UI</Font>
  <Font Id="2" Height="-18" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
  <Font Id="3" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
  <Font Id="4" Height="-12" Weight="500" Foreground="000000">Segoe UI</Font>
  <Font Id="5" Height="-12" Weight="500" Foreground="ff0000" Background="FFFFFF" Underline="yes">Segoe UI</Font>

  <Page Name="Help">
    <Text X="11" Y="10" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Text>
    <Text X="11" Y="40" Width="-11" Height="-30" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Text>
    <Static X="0" Y="319" Width="495" Height="1" HexStyle="0x00000200L" Visible="no"/>
    <Text X="11" Y="-11" Width="246" Height="17" FontId="4" DisablePrefix="yes">#(loc.InstallVersion)</Text>
    <Button Name="HelpCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.HelpCloseButton)</Button>
  <Page Name="Install">
    <!--<Image X="00" Y="00" Width="500" Height="390" ImageFile="Background.png" Visible="no"/>-->
    <Image X="00" Y="00" Width="160" Height="309" ImageFile="TITUS_SideBanner.png" Visible="no"/>
    <Static X="0" Y="309" Width="495" Height="1" HexStyle="0x00000200L" Visible="no"/>
    <Text X="170" Y="20" Width="-11" Height="60" FontId="2" DisablePrefix="yes">#(loc.InstallHeader)</Text>
    <Text X="170" Y="100" Width="-11" Height="-129" FontId="3" DisablePrefix="yes">#(loc.InstallMessage)</Text>
    <Text X="11" Y="-11" Width="246" Height="17" FontId="4" DisablePrefix="yes" Visible="no" TabStop="no">#(loc.InstallVersion)</Text>
    <Checkbox Name="InstallClient1Checkbox" X="180" Y="180" Width="-11" Height="17" FontId="3" TabStop="yes" HideWhenDisabled="no">#(loc.Client1Checkbox)</Checkbox>
    <Checkbox Name="InstallClient2Checkbox" X="180" Y="200" Width="-11" Height="17" FontId="3" TabStop="yes" HideWhenDisabled="no">#(loc.Client2Checkbox)</Checkbox>
    <Checkbox Name="InstallClient3Checkbox" X="180" Y="220" Width="-11" Height="17" FontId="3" TabStop="yes" HideWhenDisabled="no">#(loc.Client3Checkbox)</Checkbox>
    <Button Name="OptionsButton" X="314" Y="-11" Width="75" Height="23" FontId="0" TabStop="yes">#(loc.InstallOptionsButton)</Button>
    <Button Name="WelcomeCancelButton" X="404" Y="-11" Width="75" Height="23" FontId="0" TabStop="yes">#(loc.InstallCancelButton)</Button>

  <Page Name="Options">
    <!--<Image X="00" Y="00" Width="500" Height="390" ImageFile="Background.png" Visible="no"/>-->
    <Image X="00" Y="00" Width="493" Height="58" ImageFile="end-user license.png" Visible="no"/>
    <Static X="0" Y="309" Width="495" Height="1" HexStyle="0x00000200L"/>
    <Static X="0" Y="58" Width="495" Height="1" HexStyle="0x00000200L"/>
    <Text X="11" Y="-11" Width="246" Height="17" FontId="4" Visible="no" DisablePrefix="yes">#(loc.InstallVersion)</Text>
    <Text X="30" Y="82" Width="444" Height="202" FontId="2" HexStyle="0x00800000L"/>
    <Richedit Name="EulaRichedit" X="31" Y="83" Width="440" Height="198" TabStop="yes" FontId="0" />
    <Checkbox Name="EulaAcceptCheckbox" X="28" Y="-56" Width="260" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
    <Button Name="OptionsOkButton" X="238" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.OptionsOkButton)</Button>
    <Button Name="InstallButton" X="314" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
    <Button Name="WelcomeCancelButton" X="404" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallCloseButton)</Button>
  <Page Name="Progress">
    <!--<Image X="00" Y="00" Width="500" Height="390" ImageFile="Background.png" Visible="no"/>-->
    <Static X="0" Y="309" Width="495" Height="1" HexStyle="0x00000100L"/>
    <Static X="0" Y="58" Width="495" Height="1" HexStyle="0x00000100L"/>
    <Image X="00" Y="00" Width="493" Height="58" ImageFile="Logo.png" Visible="no"/>
    <Text X="11" Y="80" Width="-11" Height="45" FontId="4" DisablePrefix="yes">#(loc.ProgressHeader)</Text>
    <Text X="11" Y="121" Width="70" Height="17" FontId="4" DisablePrefix="yes">#(loc.ProgressLabel)</Text>
    <Text X="11" Y="-11" Width="246" Height="17" FontId="4" DisablePrefix="yes">#(loc.InstallVersion)</Text>
    <Text Name="OverallProgressPackageText" X="85" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Text>
    <Text Name="ExecuteProgressActionDataText" X="11" Y="163" Width="-11" Height="17" FontId="3" DisablePrefix="yes"/>
    <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="143" Width="-11" Height="15" />
    <Button Name="ProgressCancelButton" X="404" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>



-----Original Message-----
From: wix-users [mailto:wix-users-bounces at lists.wixtoolset.org] On Behalf Of Matt Hauck
Sent: August-04-15 1:58 PM
To: wix-users at lists.wixtoolset.org
Subject: [wix-users] More Advanced WiX Bootstrapper UI


I have a question about how people are using / expected to use the WiX Bootstrapper, in particular with reference to the UI component. It seems to me to be incomplete as it stands for anything beyond bundling prerequisites.

(Background: I have used WiX in the past for making MSIs and really really like it. I am working on a project now that I would like to move off of NSIS into WiX and am getting hung up on something I hope someone here can help out with.)

As far as I can tell, the wix standard bootstrapper <http://wixtoolset.org/documentation/manual/v3/bundle/wixstdba/> provides only one main screen, perhaps with an options page as well (that I only found looking at the code, not in the docs; may have missed it). It provides the ability to customize/theme this page, but does not allow the insertion of arbitrary pages, define custom actions to call between these pages, etc., as one can do in a WiX MSI UI.

I believe this is incomplete, as it does not provide the opportunity to gather the right amount of information needed to decide which components need to be installed. (caveat: with a standard user experience. It may be possible with the options page, but an options page is not something we can expect our users to click on when important decisions need to be made on that page)

It seems to me the only reason someone would want to generate a bundled / bootstrapped application is because there are multiple things one needs to install. These boil down to two basic categories: prerequisites and optional features.

In the case one only cares about bundling prerequisites, I suppose the current state of things works just fine for most people. If all you need to do is make sure .NET and C++ runtimes are installed, then the bootstrapper UI just needs to display the license and then say "Go!", and then the MSI can add its own UI layer down below to provide further advanced configuration. Perhaps this is the 80% use case.

However, I think there is also a significant use case for using a wix bundle for installing optional features. For example, we may want to bundle SQL Server Express. This is obviously not something we want to just always install. We want to allow the user to specify their own SQL Server if they want or select the "Please install it for me" checkbox. Therefore, this has to happen at the bootstrap layer, not at our MSI layer, requiring a more flexible bootstrap UI with multiple pages.

So here is the question: *What is recommended in this scenario?* It is a bit unfortunate that the only valid option left for me is to entirely roll my own UI application using WPF or something like that (which may end up bringing in .NET dependency, which we are trying to avoid). This is a significant enough hurdle that it will meet with sufficient push back from the team that we will probably not go with WiX. This is sad, because WiX is so much better than NSIS in my opinion on other fronts.

Hopefully that is not too wordy. Please let me know if I have misunderstood anything and what guidance you would provide.



WiX Toolset Users Mailing List provided by FireGiant http://www.firegiant.com/


This message has been marked as Public by Steven Ogilvie on August-04-15 2:11:24 PM.

The above classification labels were added to the message by TITUS Message Classification. 
For more information visit www.titus.com.

More information about the wix-users mailing list