Wix, custom dialog when previous version exists

假如想象 提交于 2019-11-26 11:37:23

问题


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=\"&amp;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=\"&amp;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:

  1. LicenseAgreementDlg <-> OldVersionDlg <-> SetupTypeDlg

  2. 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

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