3

I am currently learning about the WiX tool to set up MSI packages for the software applications we have where I work.

One of the things I wanted to do as part of an installation is offer a choice of a particular file to be installed, and I was going to have a dialog with a list of radio buttons, to the allow the user to select the required option.

Here is the WXS file I am using

<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:iis='http://schemas.microsoft.com/wix/IIsExtension'>
  <Product Id='E22E3B45-CFA6-4F4E-9D37-AA95A3684522' Name='Test Install' Language='1033'
           Version='1.0.0.0' Manufacturer='Microsoft Corporation' UpgradeCode='E22E3B45-CFA6-4F4E-9D37-AA95A3684522'>
    <Package Description='Test Installer Package'
              Comments='Install Test'
              Manufacturer='Microsoft Corporation' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='testinstall.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='dir_temp' Name='Temp'>
        <Component Id='component_dir_root1' Guid='A51094B8-552F-49C4-9E5C-36815D471913'>
          <File Id='file_readme.txt' Name='readme.txt' DiskId='1' Source='root/readme.txt' />
        </Component>
        <Component Id='component_dir_root2' Guid='A51094B8-552F-49C4-9E5C-36815D471914'>
          <File Id='file_readme2.txt' Name='readme2.txt' DiskId='1' Source='root/readme2.txt' />
        </Component>
      </Directory>
    </Directory>

    <Feature Id='feature_test' Title='Test Features' Level='1'>
      <Feature Id='feature_dir_root1' Level='1'>
        <ComponentRef Id='component_dir_root1' />
        <Condition Level="0"><![CDATA[RootType <> "1"]]></Condition>
      </Feature>
      <Feature Id='feature_dir_root2' Level='1'>
        <ComponentRef Id='component_dir_root2' />
        <Condition Level="0"><![CDATA[RootType <> "2"]]></Condition>
      </Feature>
    </Feature>

    <UI>
      <Property Id="DefaultUIFont">DlgFont8</Property>

      <Dialog Id="InstallDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
    <Control Id="Buttons" Type="RadioButtonGroup" X="20" Y="187" Width="330" Height="40" Property="RootType" />

        <Control Id="Install" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Text="Install">
          <Publish Event="EndDialog" Value="Return" />
        </Control>
      </Dialog>

      <RadioButtonGroup Property="RootType">
        <RadioButton Text="{\DlgFont8}Root 1"
          Value="1" X="5" Y="0" Width="250" Height="15" />
        <RadioButton Text="{\DlgFont8}Root2"
          Value="2" X="5" Y="20" Width="250" Height="15" />
      </RadioButtonGroup>

      <TextStyle Id="DlgFont8" FaceName="Tahoma" Size="8" />

      <InstallUISequence>
        <Show Dialog="InstallDlg" After="CostFinalize" />
      </InstallUISequence>
    </UI>

    <Property Id="RootType">2</Property>
  </Product>
</Wix>

So, there are two features present. Each corresponding to an individual component representing the files. The radio buttons link to a RootType property which I want to control which feature is installed.

The dialog is shown fine, and if I vary the default value of the RootType the correct radio button is always checked when the installation form is shown. However, if a different radio button is selected by the user during installation, it doesn't actually make any different to which file gets installed. The file that gets installed is always the one that is set as the initial value of the RootType property.

Is there something else that needs to be done to get the radio buttons to update the property before the features are installed?

Tim C
  • 70,053
  • 14
  • 74
  • 93

3 Answers3

4

By the time your dialogs are shown, it's too late to set properties to influence feature conditions against INSTALLLEVEL. Instead you should put Control Events on the Next (or similar) button on the dialog with the radio buttons that use AddLocal or Remove to control whether the feature gets installed.

Michael Urman
  • 15,737
  • 2
  • 28
  • 44
  • Hey, Can you explain a little detail way o adding control events on next button clicks with sample code ? I am new to wix as well. do you mean this https://www.packtpub.com/books/content/windows-installer-xml-wix-adding-user-interface – Sakthivel Sep 23 '14 at 14:36
3

I was having the exact same issue for days. I found many examples of condition statements online, always ending up with the same problem. After reading Michael Urman's answer, I decided to figure out what exactly he meant with "...Instead you should put Control Events on the Next (or similar) button on the dialog with the radio buttons that use AddLocal or Remove to control whether the feature gets installed."

Here goes:

Don't put the condition statements within features. Get rid of them. Instead, check the values of the radio buttons within the Control of a button! In your case, the Install button.

An example:

      <Control Id="Install" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Text="Install">
        <!--Check button values here:-->
        <Publish Event="AddLocal" Value="ALL">1</Publish>
        <Publish Event="Remove" Value="feature_dir_root1">RootType = 1</Publish>
        <Publish Event="Remove" Value="feature_dir_root2">RootType = 2</Publish>
        <Publish Event="EndDialog" Value="Return" />
      </Control>

I found an article that explains a bit more about all of this, along with the AddLocal Publish Event. You need that as well so don't remove it!

So again, the value linked to the radio buttons is actually checked when the Install button is pressed. That's it basically.

This will indeed install a feature based on the radio button selected by the user. Hope that helps!

0

Adding to @dankmemester's answer, the below code works fine in Wix 3.11, it requires an 'Order' sequence.

        <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" >
            <Publish Event="EndDialog" Value="Return" Order='20'/>
            <Publish Event="ADDLOCAL" Value="ALL" Order='10' />
            <Publish Event="Remove" Value="QC_ALT_Feature" Order='11'>QC_TYPE="2"</Publish>
            <Publish Event="Remove" Value="QC_STD_Feature" Order='11'>QC_TYPE="1"</Publish>
        </Control>
thanga
  • 163
  • 2
  • 13