Wix UI customization: Adding InstallScopeDlg to WixUI_Minimal

淺唱寂寞╮ 提交于 2021-01-29 20:27:30

问题


I am trying to add the InstallScopeDlg to my installer using Wix. Because InstallScopeDlg is only available in WixUI_Advanced but I don't need the other dialogs from that UI, I decided to create my own UI by copying WixUI_Minimal code and renaming to WixUI_MyMinimal. Then I changed some of the sequences and button names so I could put InstallScopeDlg after the WelcomeEulaDlg and before ProgressDlg. I also copied the other required dialogs to my Wix project in visual studio.
The interface is shown correctly but the "Next" button on InstallScopeDlg does not work and shows the ProgressDlg without doing anything.

1 - Is this a correct solution to add the InstallScopeDlg?
2 - How can I fix this problem?

The following is the code for WixUI_MyMinimal

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
    <WixVariable Id="WixUISupportPerUser" Value="1" Overridable="yes" />
    <WixVariable Id="WixUISupportPerMachine" Value="1" Overridable="yes" />
    <PropertyRef Id="ApplicationFolderName" />

    <CustomAction Id="WixSetDefaultPerUserFolder" Property="WixPerUserFolder" Value="[LocalAppDataFolder]Apps\[ApplicationFolderName]" Execute="immediate" />
    <CustomAction Id="WixSetDefaultPerMachineFolder" Property="WixPerMachineFolder" Value="[ProgramFilesFolder][ApplicationFolderName]" Execute="immediate" />
    <CustomAction Id="WixSetPerUserFolder" Property="APPLICATIONFOLDER" Value="[WixPerUserFolder]" Execute="immediate" />
    <CustomAction Id="WixSetPerMachineFolder" Property="APPLICATIONFOLDER" Value="[WixPerMachineFolder]" Execute="immediate" />

    <InstallExecuteSequence>
        <Custom Action="WixSetDefaultPerUserFolder" Before="CostFinalize" />
        <Custom Action="WixSetDefaultPerMachineFolder" After="WixSetDefaultPerUserFolder" />
        <Custom Action="WixSetPerUserFolder" After="WixSetDefaultPerMachineFolder">ACTION="INSTALL" AND APPLICATIONFOLDER="" AND (ALLUSERS="" OR (ALLUSERS=2 AND (NOT Privileged)))</Custom>
        <Custom Action="WixSetPerMachineFolder" After="WixSetPerUserFolder">ACTION="INSTALL" AND APPLICATIONFOLDER="" AND (ALLUSERS=1 OR (ALLUSERS=2 AND Privileged))</Custom>
    </InstallExecuteSequence>


    <UI Id="WixUI_MyMinimal">
        <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="myWixUI_Mode" Value="InstallCustom" />

        <DialogRef Id="ErrorDlg" />
        <DialogRef Id="FatalError" />
        <DialogRef Id="FilesInUse" />
        <DialogRef Id="MsiRMFilesInUse" />
        <DialogRef Id="PrepareDlg" />
        <DialogRef Id="ProgressDlg" />
        <DialogRef Id="ResumeDlg" />
        <DialogRef Id="UserExit" />
        <DialogRef Id="WelcomeDlg" />
        <DialogRef Id="WelcomeEulaDlg" />
        <DialogRef Id="InstallScopeDlg"/>

        <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>

        <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">1</Publish>

        <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">1</Publish>

        <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" Order="2">1</Publish>
        <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" Order="2">1</Publish>
        <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" Order="2">1</Publish>

        <Publish Dialog="InstallScopeDlg" Control="Next" Property="WixAppFolder" Value="WixPerUserFolder" Order="1">!(wix.WixUISupportPerUser) AND NOT Privileged</Publish>
        <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="{}" Order="2">WixAppFolder = "WixPerUserFolder"</Publish>
        <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="1" Order="3">WixAppFolder = "WixPerMachineFolder"</Publish>
        <Publish Dialog="InstallScopeDlg" Control="Next" Property="APPLICATIONFOLDER" Value="[WixPerUserFolder]" Order="4">WixAppFolder = "WixPerUserFolder"</Publish>
        <Publish Dialog="InstallScopeDlg" Control="Next" Property="APPLICATIONFOLDER" Value="[WixPerMachineFolder]" Order="5">WixAppFolder = "WixPerMachineFolder"</Publish>
        <Publish Dialog="InstallScopeDlg" Control="Next" Event="NewDialog" Value="ProgressDlg" Order="6">WixAppFolder = "WixPerUserFolder"</Publish>
        <Publish Dialog="InstallScopeDlg" Control="Next" Event="NewDialog" Value="ProgressDlg" Order="7">WixAppFolder = "WixPerMachineFolder"</Publish>

        <Publish Dialog="InstallScopeDlg" Control="Back" Event="NewDialog" Value="WelcomeEulaDlg" Order="2">1</Publish>

        <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="WelcomeEulaDlg" Order="2">!(wix.WixUISupportPerMachine) AND !(wix.WixUISupportPerUser)</Publish>
        <Publish Dialog="WelcomeEulaDlg" Control="Install" Event="NewDialog" Value="InstallScopeDlg" Order="2">!(wix.WixUISupportPerMachine) AND !(wix.WixUISupportPerUser)</Publish>
        <Publish Dialog="WelcomeEulaDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
        <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>

        <InstallUISequence>
            <Show Dialog="WelcomeDlg" Before="WelcomeEulaDlg">Installed AND PATCH</Show>
            <Show Dialog="WelcomeEulaDlg" Before="InstallScopeDlg">NOT Installed</Show>
            <Show Dialog="InstallScopeDlg" Before="ProgressDlg">NOT Installed</Show>
            <Custom Action="WixSetDefaultPerUserFolder" Before="CostFinalize" />
            <Custom Action="WixSetDefaultPerMachineFolder" After="WixSetDefaultPerUserFolder" />
            <Custom Action="WixSetPerUserFolder" After="WixSetDefaultPerMachineFolder">ACTION="INSTALL" AND APPLICATIONFOLDER="" AND (ALLUSERS="" OR (ALLUSERS=2 AND (NOT Privileged)))</Custom>
            <Custom Action="WixSetPerMachineFolder" After="WixSetPerUserFolder">ACTION="INSTALL" AND APPLICATIONFOLDER="" AND (ALLUSERS=1 OR (ALLUSERS=2 AND Privileged))</Custom>

        </InstallUISequence>

        <Property Id="ARPNOMODIFY" Value="1" />
    </UI>

    <UIRef Id="WixUI_Common" />
</Fragment>


回答1:


Take a look at my open source project ISWIX (CodePlex). It includes a multiple project solution template that includes a project for building the MSI. It adds a reference to WiXUI and uses a series of fragments to reference a built in dialog set and then one additional reference to insert a custom dialog into the set. This is done by adding Publish elements (DoAction ControlEvents) to the Next and Back buttons of the neighboring dialogs. All of this is achieved in a way that feels as close to inheritance as possible.

http://iswix.codeplex.com/SourceControl/latest#main/Source/Application/IsWiXAddIn/MSISolutionTemplate/SetupProjectTemplate/UI.wxs

http://iswix.codeplex.com/SourceControl/latest#main/Source/Application/IsWiXAddIn/MSISolutionTemplate/SetupProjectTemplate/UI-CustomDialog.wxs

Also, be very sure you really want to support per-user installations. They are a pain to deal and only valuable in limited scenarios.

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Add-install-InstallScopeDlg-to-WixUI-InstallDir-wxs-td7588647.html



来源:https://stackoverflow.com/questions/22254945/wix-ui-customization-adding-installscopedlg-to-wixui-minimal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!