我正在使用WixUIFeatureTree为用户提供他们想要安装的应用程序的哪些组件的选项...我的一个功能中有两个可选功能,其中至少必须安装一个以使程序正常工作。我不想强迫用户安装任何一个,但我不知道如何强迫他们选择至少一个。
这是我当前WXS的相关部分:
<Feature Id="Main" Title="Product Name" Level="1" Absent="disallow" Display="expand" AllowAdvertise="no"
Description="This is the application, and is a required component"
>
<ComponentRef Id="Baseline" />
<ComponentRef Id="Shortcuts" />
<Feature Id="Option1" Title="Plugin #1" Level="2" Absent="allow" AllowAdvertise="no">
<ComponentRef Id="Plugin1Component" />
</Feature>
<Feature Id="Option2" Title="Plugin #2" Level="3" Absent="allow" AllowAdvertise="no">
<ComponentRef Id="Plugin2Component" />
</Feature>
</Feature>
我猜我需要在序列的正确位置插入一些自定义动作,保证选择一个或另一个进行安装,但不知道如何做到这一点,或者它是否均匀对。所有帮助表示赞赏!
答案 0 :(得分:4)
我意识到这是一篇旧帖子,但这就是我使用带有UI FeatureTree的WIX v3.7解决这个问题的方法:
<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">&MyAppClientFeature=3 OR &MyAppPrinterFeature=3</Publish>
完整FeatureTree覆盖代码:
<UI Id="WixUI_FeatureTreeCustom">
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="FeatureTree" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
<Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg">LicenseAccepted = "1"</Publish>
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">Installed</Publish>
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg" Order="2">NOT Installed</Publish>
<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">&MyAppClientFeature=3 OR &MyAppPrinterFeature=3</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">NOT Installed OR WixUI_InstallMode = "Change"</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
</UI>
<UIRef Id="WixUI_Common" />
我希望这可以帮助别人。
答案 1 :(得分:2)
我认为你真正想要做的是在&lt; Publish&gt;中加入条件。 “下一步”按钮的元素在满足条件之前不启用它。类似的东西:
<Publish Dialog="..." Control="Next" Event="NewDialog" Value="...">OptionalPkg1Selected OR OptionaloPkg2Selected</Publish>
我不知道的是如何根据检查的组件设置这些条件,但必须有一些方法来做到这一点,以便稍后安装正确的组件......
答案 2 :(得分:1)
如何将Feature状态用作条件?
类似(&amp; Option1 = 2)AND(&amp; Option2 = 2)
这是一个更好理解的链接:
答案 3 :(得分:0)
我现在没有时间进行技术测试,但只想指出INSTALLLEVEL属性的方向。这是一个与功能选择相关的反直觉概念。本质上,安装的总体INSTALLLEVEL是1到32,767之间的数字,每个功能都有一个安装级别属性,它是介于-32,767和32,767之间的数字。如果要素的“安装级别”值小于或等于产品的INSTALLLEVEL属性,则会启用该功能:http://kb.acresso.com/selfservice/viewContent.do?externalID=Q103232
通常,您可以使用此选项设置默认功能状态,并在不支持该功能的操作系统上禁用隐藏功能。但是,您可以在对话框的下一个按钮事件中使用这些属性以及自定义操作,以强制选择至少一个功能。
是的,MSI对话框一般没有意义,而且它们是复杂的工作方式。在某些情况下,我已经用一个常规的Windows exe对话框替换了序列中的单个对话框,以解决整个MSI GUI概念中的限制。
如果有更简单的方法,我会想一想。听起来这听起来非常紧急,所以也许你想查看部署社区并仔细阅读一些最好的部署站点: