5

我正在使用 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>

我猜我需要在序列的正确位置插入某种自定义操作,以确保选择安装其中一个或另一个,但不知道如何执行此操作,或者它是否正确。所有帮助表示赞赏!

4

4 回答 4

4

我意识到这是一篇旧文章,但这就是我使用 WIX v3.7 和 UI FeatureTree 解决这个问题的方法:

<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">&amp;MyAppClientFeature=3 OR &amp;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">&amp;MyAppClientFeature=3 OR &amp;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" />

我希望这可以帮助某人。

于 2013-04-28T07:35:39.293 回答
2

我认为您在这里真正想要做的是在 <Publish> 元素中为 Next 按钮设置一个条件,以便在满足您的条件之前不启用它。就像是:

<Publish Dialog="..." Control="Next" Event="NewDialog" Value="...">OptionalPkg1Selected OR OptionaloPkg2Selected</Publish>

我不知道如何根据检查的组件来设置这些条件,尽管必须有某种方法来做到这一点,以便以后安装正确的组件......

于 2009-09-08T17:49:04.887 回答
1

使用 Feature 状态作为条件怎么样?

类似于 (&Option1=2) AND (&Option2=2)

这是一个链接,以便更好地理解:

MSI 高级自定义操作

于 2009-10-09T17:08:01.523 回答
0

我现在没有时间进行技术测试,只是想向您指出 INSTALLLEVEL 属性的方向。这是一个与特征选择相关的相当违反直觉的概念。本质上,安装有一个整体 INSTALLLEVEL,它是一个介于 1 和 32,767 之间的数字,并且每个功能都有一个安装级别属性,它是一个介于 -32,767 和 32,767 之间的数字。如果某个功能的 Install Level 值小于或等于产品的 INSTALLLEVEL 属性,则启用该功能:http://kb.acresso.com/selfservice/viewContent.do?externalID= Q103232

通常,您使用它来设置默认功能状态并禁用不支持该功能的操作系统上的隐藏功能。但是,您可以使用这些属性以及在对话框的下一个按钮事件上运行的自定义操作来强制选择至少一项功能。

是的,MSI 对话框通常没有意义,而且使用起来很复杂。在某些情况下,我用常规的 windows exe 对话框替换了序列中的单个对话框,以解决整个 MSI GUI 概念中的限制。

如果有更简单的方法可以做到这一点,我会考虑一下。听起来这很紧急,所以也许您想咨询部署社区并仔细阅读一些最好的部署站点:

于 2009-09-15T02:41:12.660 回答