3

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

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

我已经找到了以下问题:如何在 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 -> welcomeDlg -> verifyDlg -> welcomeDlg -> verifyDlg -> progressDlg ...

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

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

我考虑过用户帐户控制会导致混乱,但是 UAC 应该怎么做才能退回 MSI 的 ui 序列?对我来说毫无意义。无论如何,我尝试通过 admin-Cmd 运行 MSI,点击安装按钮时应该抑制 UAC 的任何提示。但仍然是同样混乱的 UI 序列。

提前感谢您的帮助。

4

2 回答 2

5

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

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

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

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

我唯一一次预先排列附加对话框是在我替换启动条件时。在这种情况下,我不希望安装程序继续,所以这很好。欢迎永远不会被调用。

于 2014-03-27T14:43:12.440 回答
2

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

第二种解决方案 下载位于 SourceForge 上的源,复制并添加一些对话框集到您的项目并替换所有您想要的。

您可以在我的博客上找到更多详细信息用自定义的 WelcomeDlg 替换标准的 WelcomeDlg

于 2015-03-31T07:21:00.873 回答