问题
I\'m making installation for my application with WiX toolset. I want to show custom dialog if previous version found.
Now I don\'t know how to check if there is previous version and show this dialog only in that case? Here is my code.
CustomDialogUI.wxs :
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">
<Fragment>
<UI>
<Dialog Id=\"OldVersionDlg\" Width=\"260\" Height=\"85\" Title=\"[ProductName] Setup\" NoMinimize=\"yes\">
<Control Id=\"No\" Type=\"PushButton\" X=\"132\" Y=\"57\" Width=\"56\" Height=\"17\"
Default=\"yes\" Cancel=\"yes\" Text=\"No\">
<Publish Event=\"EndDialog\" Value=\"Exit\">1</Publish>
</Control>
<Control Id=\"Yes\" Type=\"PushButton\" X=\"72\" Y=\"57\" Width=\"56\" Height=\"17\" Text=\"Yes\">
<Publish Event=\"EndDialog\" Value=\"Return\">1</Publish>
</Control>
<Control Id=\"Text\" Type=\"Text\" X=\"5\" Y=\"15\" Width=\"250\" Height=\"30\">
<Text>A previous version of [ProductName] is currently installed. By continuing the installation this version will be uninstalled. Do you want to continue?</Text>
</Control>
<Control Id=\"Back\" Type=\"PushButton\" X=\"180\" Y=\"243\" Width=\"56\" Height=\"17\" Text=\"&Back\">
<Publish Event=\"NewDialog\" Value=\"LicenseAgreementDlg\">1</Publish>
</Control>
<Control Id=\"Next\" Type=\"PushButton\" X=\"236\" Y=\"243\" Width=\"56\" Height=\"17\" Default=\"yes\" Text=\"&Next\">
<Publish Event=\"ValidateProductID\" Value=\"0\">1</Publish>
<Publish Event=\"SpawnWaitDialog\" Value=\"WaitForCostingDlg\">CostingComplete = 1</Publish>
<Publish Event=\"NewDialog\" Value=\"SetupTypeDlg\">ProductID</Publish>
</Control>
<Control Id=\"Cancel\" Type=\"PushButton\" X=\"304\" Y=\"243\" Width=\"56\" Height=\"17\" Cancel=\"yes\" Text=\"Cancel\">
<Publish Event=\"SpawnDialog\" Value=\"CancelDlg\">1</Publish>
</Control>
<Control Id=\"BannerLine\" Type=\"Line\" X=\"0\" Y=\"50\" Width=\"370\" Height=\"0\" />
</Dialog>
</UI>
With this I have created my dialog as I wanted and inserted into the original chain of dialogs.
And in my Project.wxs
<UI Id=\"MyWixUI_Mondo\">
<UIRef Id=\"WixUI_Mondo\" />
<UIRef Id=\"WixUI_ErrorProgressText\" />
<DialogRef Id=\"OldVersionDlg\" />
<Publish Dialog=\"LicenseAgreementDlg\" Control=\"Next\" Event=\"NewDialog\" Value=\"OldVersionDlg\" Order=\"3\">LicenseAccepted = \"1\"</Publish>
<Publish Dialog=\"SetupTypeDlg\" Control=\"Back\" Event=\"NewDialog\" Value=\"OldVersionDlg\">1</Publish>
</UI>
With this I get my OldVErsionDlg everytime, and I don\'t know how to make him show ONLY if previous version exists.
I have added to Project.wxs
<Property Id=\"PREVIOUSVERSIONSINSTALLED\" Secure=\"yes\" />
<Upgrade Id=\"{80EE38CE-1A3B-445F-8CC1-31B32AA77715}\">
<UpgradeVersion Minimum=\"1.0.0.0\" Maximum=\"9.0.0.0\"
Property=\"PREVIOUSVERSIONSINSTALLED\"
IncludeMinimum=\"yes\" IncludeMaximum=\"no\" />
</Upgrade>
and tried with:
<UI Id=\"MyWixUI_Mondo\">
<UIRef Id=\"WixUI_Mondo\" />
<UIRef Id=\"WixUI_ErrorProgressText\" />
<DialogRef Id=\"OldVersionDlg\" />
<Publish Dialog=\"LicenseAgreementDlg\" Control=\"Next\" Event=\"NewDialog\" Value=\"OldVersionDlg\" Order=\"3\">LicenseAccepted = \"1\" AND PREVIOUSVERSIONSINSTALLED</Publish>
<Publish Dialog=\"SetupTypeDlg\" Control=\"Back\" Event=\"NewDialog\" Value=\"OldVersionDlg\">1</Publish>
</UI>
No luck with that.
回答1:
Next / Back Button Override: I am no GUI expert, in fact it is a neglected area (GUI is always suppressed for corporate deployment), but I believe something like this can work - redefining the Next and Back buttons - 3 dialogs involved:
<!-- 1. OldVersionDlg showing -->
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog"
Value="OldVersionDlg">LicenseAccepted = "1" AND PREVIOUSVERSIONSINSTALLED</Publish>
<Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog"
Value="OldVersionDlg">PREVIOUSVERSIONSINSTALLED</Publish>
<!-- 2. OldVersionDlg dialog not showing -->
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog"
Value="SetupTypeDlg">LicenseAccepted = "1" AND NOT PREVIOUSVERSIONSINSTALLED</Publish>
<Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog"
Value="LicenseAgreementDlg">NOT PREVIOUSVERSIONSINSTALLED</Publish>
Actual Dialog Sequences:
LicenseAgreementDlg
<->
OldVersionDlg
<->
SetupTypeDlg
LicenseAgreementDlg
<->
SetupTypeDlg
To be sure, remember to test in all installation modes: install
, upgrade
, repair
, modify
, patching
, uninstall
(and there are stranger shores such as resumed installs - rarely seen).
In closing: is this feature really necessary? I find that features like these often cause more bugs than benefits, but that is just a personal opinion. In fact I wrote an answer a long time ago on how to implement such an upgrade check without using setup dialogs.
Some Links:
- Changing text color to Wix dialogs (Customizing WiX GUI)
- Wix default folder dialog
来源:https://stackoverflow.com/questions/33690724/wix-custom-dialog-when-previous-version-exists