如何在welcomeDlg之前插入自定义对话框而不会弄乱UI-Sequence

时间:2014-03-27 14:01:44

标签: wix wix-extension wix3.8

我想创建一个自定义对话框,在欢迎对话框之前安排。自定义对话框有一个位图控件,一些文本控件和两个用于取消(SpawnDialog-> CancelDlg)和下一个(NewDialog-> WelcomeDlg)的按钮。没有花哨的自定义操作或设置属性。

  • Wix版本:3.8
  • 使用WixUI_InstallDir.wxs

我已经找到了以下问题:How can I insert custom dialog before WelcomeDlg? 尽管标记为已回答,但提问者使用该答案的解决方案获得与我相同的错误消息(请参阅注释)。所以请不要将此标记为副本。

以下代码(来自customDialog.wxs,WixUi_InstallDir.wxs中的dialogRef)构建,自定义对话框显示为第一个对话框,...

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
 <Fragment>
  <UI>
   <Dialog Id="CustomDlg" Width="370" Height="270" Title="[ProductName] - Setup">
    <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
      <Publish Event="NewDialog" Value="WelcomeDlg">1</Publish>
    </Control>
    <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" Disabled="yes"/>
    <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
      <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
    </Control>         
    <!-- ... More Controls ... -->
   </Dialog>

   <InstallUISequence>
     <Show Dialog="CustomDlg" After="CostFinalize">NOT Installed OR PATCH</Show>
   </InstallUISequence>
  </UI>
 </Fragment>
</Wix>

...但是UI序列完全搞砸了:

customDlg - &gt; welcomeDlg - &gt; verifyDlg - &gt; welcomeDlg - &gt; verifyDlg - &gt; progressDlg ...

因此,单击“安装”按钮会导致跳回欢迎对话框。在第二个“转弯”中,单击安装按钮具有触发安装所需的效果:-P

我尝试通过@Before,@ After或@Sequence(我使用Orca来查看UISequence)在不同的地方安排我的自定义对话框,甚至构建我自己的WelcomeDlg(如下所述:http://neilsleightholm.blogspot.de/2008/08/customised-uis-for-wix.html )。我在WelcomeDlg中搞乱了InstallUISequence-Element,就像在自定义对话框之后安排它一样。 但是(惊喜)@ After =“CustomDlg”与自定义对话框中的@ Before =“WelcomeDlg”具有相同的效果,再次弄乱了UI序列。

我认为用户帐户控制导致了这个混乱,但是UAC应该怎么做才能退回MSI的ui序列?对我毫无意义。无论如何,我尝试在admin-Cmd上运行MSI什么应该在按下安装按钮时抑制UAC的任何提示。但仍然是相同的UI序列。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

通常只有1个对话框(welcomeDlg)在InstallUISequence表中有一个条目。所有其他对话框都由NewDialog ControlEvents引入。您所做的是添加一个新对话框,并在welcomeDlg之前在UI序列中安排它。然后,您将NewDialog事件链接到两者。

当你进入verifyDlg时,它会调用和EndDialog控制事件,将控制权转移回InstallUISequence。然后InstallUISequence找到welcomeDlg的入口点,并且该过程重复进行。

您应该删除自定义对话框和欢迎对话框之间的关系,并将其替换为EndDialog控件事件。请注意,这意味着无法从欢迎回到第一个自定义对话框。

如果您需要将自定义对话框作为第一个对话框,那么您需要做很多工作。我建议第一个对话应该是受欢迎的,所以这不是一个好的练习。

我预先排序其他对话框的唯一时间是我替换启动条件。在这种情况下,我不希望安装程序继续,所以没关系。欢迎永远不会被召唤。

答案 1 :(得分:2)

第一个解决方案 您可以将新自定义对话框的条目添加到InstallUISequence表中,并关闭标准欢迎对话框。

第二个解决方案 下载位于SourceForge上的资源,复制并添加一些对话框到项目中并替换所有你想要的东西。

您可以在我的博客Replacing a standard WelcomeDlg with a custom one

上找到更多详细信息