2014-03-27 56 views
2

我想创建一个自定义对话框,它安排在欢迎对话框之前。自定义对话框有一个位图控件,一些文本控件和两个取消按钮(SpawnDialog-> CancelDlg)和下一个(NewDialog-> WelcomeDlg)。没有花哨的自定义操作或设置属性。如何在welcomeDlg之前插入一个自定义对话框,而不会搞乱UI-Sequence

  • 维克斯版本:3.8
  • 使用WixUI_InstallDir.wxs

我已经发现了以下问题:How can I insert custom dialog before WelcomeDlg? 虽然其标记为回答,提问者得到相同的错误消息(见注释)作为我使用该答案的解决方案。所以请不要把这个标记为重复。

下面的代码(从customDialog.wxs,与dialogRef在WixUi_InstallDir.wxs)不建,以及自定义对话框中显示为第一个对话框,...

<?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/customised-uis-for-wix.html)。我在WelcomeDlg中将InstallUISequence-Element搞乱了,就像在自定义对话框之后安排它一样。 但是(意外的惊喜)@ After =“CustomDlg”与自定义对话框中的@ Before =“WelcomeDlg”具有相同的效果,再次搞乱UI序列。

我想到了导致这个混乱的用户帐户控制,但是UAC应该如何退出MSI的ui序列呢?对我没有意义。无论如何,我试图运行MSI管理-CMD什么应该抑制任何提示的UAC时按下安装按钮。但仍然一样搞砸了UI序列。

在此先感谢您的帮助。

回答

4

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

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

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

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

我曾经唯一一次对其他对话框进行序列化的时候是当我替换启动条件时。在这种情况下,我不希望安装程序继续下去,所以没关系。欢迎永远不会被召唤。

+0

感谢您的快速回答克里斯托弗。你真的清除了我的UI序列的行为。无论如何,我想要放置的对话将是一种“化妆”功能。正如你所指出的那样,不值得工作,也不是一个很好的锻炼,所以我只是改变了欢迎对话框以适应我的需求。 – Sepelio

2

首先解决 您可以添加进入到新的自定义对话框到InstallUISequence表,并关闭标准的欢迎对话框。

解决方法二 位于SourceForge上的下载源,复制并添加一些对话框设置为你的项目和替换所有你想要的是什么。

更多细节,你可以找到我的blogue Replacing a standard WelcomeDlg with a custom one

相关问题