Wix3.11引导程序无需自定义UI如何实现MSI包可选安装?
实现结论
无需开发完全自定义的引导程序应用(BA),仅通过修改现有主题XML和Bundle配置即可实现该需求,Wix 3.11的标准引导程序(WixStdBA)原生支持复选框/单选框和Bundle变量的自动绑定。
具体操作步骤
1. 在Bundle中新增选择状态变量
在你现有InstallFolder变量定义下方,新增两个数字类型的持久化变量,用于存储用户的安装选择(默认值1代表默认勾选):
<Variable Name="InstallClassLibrary" Type="numeric" Value="1" Persisted="yes" /> <Variable Name="InstallConsoleApp" Type="numeric" Value="1" Persisted="yes" />
2. 为MSI包添加安装条件
修改两个MsiPackage节点,新增InstallCondition属性,仅当对应变量值为1时才执行该MSI的安装:
<Chain> <MsiPackage Id="ClassLibraryMsi" SourceFile="$(var.WixProjectForDemoClassLibrary.TargetDir)WixProjectForDemoClassLibrary.msi" DisplayName="Demo Class Library" Visible="yes" InstallCondition="InstallClassLibrary = 1"> <MsiProperty Name="APPLICATIONFOLDER" Value="[InstallFolder]"/> </MsiPackage> <MsiPackage Id="ConsoleAppMsi" SourceFile="$(var.WixProjectForDemoConsoleApp.TargetDir)WixProjectForDemoConsoleApp.msi" DisplayName="Demo Console App" Visible="yes" InstallCondition="InstallConsoleApp = 1"> <MsiProperty Name="APPLICATIONFOLDER" Value="[InstallFolder]" /> </MsiPackage> </Chain>
3. 修改主题XML添加选择控件
你可以选择在Options页面或者Install页面添加复选框,只需要保证复选框的Name属性和你前面定义的变量名完全一致,WixStdBA会自动同步用户选择到变量中。以下是添加到Options页面的示例:
- 先调整窗口高度,避免控件溢出:把
Window节点的Height从320改为380 - 调整原有路径选择控件的Y坐标,在中间插入两个复选框:
<Page Name="Options"> <Text X="141" Y="20" Width="-11" Height="30" FontId="2">#(loc.OptionsHeader)</Text> <!-- 新增两个选择复选框 --> <Checkbox Name="InstallClassLibrary" X="141" Y="61" Width="300" Height="17" TabStop="yes" FontId="3">安装Demo Class Library</Checkbox> <Checkbox Name="InstallConsoleApp" X="141" Y="85" Width="300" Height="17" TabStop="yes" FontId="3">安装Demo Console App</Checkbox> <!-- 原有路径选择控件向下偏移,避免重叠 --> <Text X="141" Y="115" Width="-11" Height="17" FontId="3">#(loc.OptionsLocationLabel)</Text> <Editbox Name="FolderEditbox" X="141" Y="140" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" /> <Button Name="BrowseButton" X="-11" Y="140" Width="75" Height="23" TabStop="yes" FontId="3">#(loc.OptionsBrowseButton)</Button> <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.OptionsOkButton)</Button> <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.OptionsCancelButton)</Button> </Page>
补充说明
如果你需要实现二选一的单选逻辑,只需要把两个复选框替换为RadioButton控件,绑定同一个数字变量即可,无需额外代码。
内容的提问来源于stack exchange,提问作者Priom Biswas
相关产品推荐
相关产品推荐

