我有两个自定义对话框 - dlg1和dlg2。用户在dlg1上单击NEXT后,应显示另一个带有一些文本和OK按钮的自定义弹出对话框。用户在此弹出窗口中单击“确定”后,应显示dlg2。我尝试了很多东西,但最好的只是在dlg1和OK-popup上显示dlg2。
答案 0 :(得分:2)
您必须创建一个模态对话框,将用户从第一个对话框传递到第二个对话框。实际上,模态对话框用于显示消息,然后将焦点返回到调用模式对话框的对话框。我不知道你是否违反任何安装程序规则,如果你没有将焦点返回到调用对话框但它似乎有效:
dlg1的代码:
<UI>
<Dialog Id="dlg1" ...>
<Control Id="firstText" Type="Text" X="10" Y="10" Width="200" Height="17" Text="First Dialog calls Modal Dialog." />
<Control Id="PopupButton" Type="PushButton" Text="Show Popup" Height="17" Width="56" X="100" Y="243" Default="yes">
<Publish Event="SpawnDialog" Value="PopupDlg" />
</Control>
</Dialog>
</UI>
PopupDlg代码:
<UI>
<Dialog Id="PopupDlg" ...>
<Control Id="OkButton" Type="PushButton" Text="{\Tahoma_Bold}OK" Height="17" Width="56" X="200" Y="175">
<Publish Event="NewDialog" Value="dlg2" />
</Control>
</Dialog>
</UI>
dlg2的代码:
<UI>
<Dialog id="dlg2" ...>
<Control Id="secondText" Type="Text" X="10" Y="10" Width="200" Height="17" Text="Now proceed." />
<Control Id="CancelButton" Type="PushButton" Text="Cancel" Height="17" Width="56" X="180" Y="243">
<Publish Event="EndDialog" Value="Exit" />
</Control>
</Dialog>
</UI>
<强>更新强> 实施上述解决方案会产生一些问题。虽然有一种解决方法,但它会降低您的代码的可读性。在发布一些代码之前,让我先描述一下解决方法背后的概念。基本上你只有两个对话框:一个触发弹出窗口和弹出窗口本身。在弹出窗口中,您不打开新窗口,如上所述,而是将焦点返回到调用对话框。另外,您可以更改属性的状态。调用对话框将根据模式对话框设置的属性进行更新。
要实现此目标,您必须在调用对话框中为每个状态添加控件,一个用于设置属性的情况,另一个用于未设置属性的情况。
调用Dialog的代码:
<UI>
<Dialog Id="callingDialog" ...>
<Control Id="BeforePopup" Type="Text" X="10" Y="10" Width="200" Height="17" Text="Here is some text." Hidden="yes">
<Condition Action="show"><![CDATA[NOT PROP_SET_BY_MODAL_DLG]]></Condition>
<Condition Action="hide"><![CDATA[PROP_SET_BY_MODAL_DLG]]></Condition>
</Control>
<Control Id="AfterPopup" Type="Text" X="10" Y="10" Width="200" Height="17" Text="Popup was shown." Hidden="yes">
<Condition Action="show"><![CDATA[PROP_SET_BY_MODAL_DLG]]></Condition>
<Condition Action="hide"><![CDATA[NOT PROP_SET_BY_MODAL_DLG]]></Condition>
</Control>
<Control Id="PopupButton" Type="PushButton" Text="Show Popup" Height="17" Width="56" X="100" Y="243" Default="yes">
<Publish Event="SpawnDialog" Value="PopupDlg" />
</Control>
</Dialog>
</UI>
PopupDlg代码:
<UI>
<Dialog Id="PopupDlg" ...>
<Control Id="OkButton" Type="PushButton" Text="OK" Height="17" Width="56" X="200" Y="175">
<Publish Property="PROP_SET_BY_MODAL_DLG" Value="1" Order="1">1</Publish>
<Publish Event="EndDialog" Value="Return" Order="2">1</Publish>
</Control>
</Dialog>
</UI>
答案 1 :(得分:0)
为此找到了另一个解决方案。它是从自定义操作中使用WinForms对话框。
当用户点击“下一步”按钮时,会调用自定义操作:
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
<Publish Event="DoAction" Value="SomeAction">1</Publish>
</Control>
在此自定义操作中,您可以调用WinForm对话框。并且不要忘记设置静默安装模式的检查,以确保在静默安装期间不会显示该对话框:
[CustomAction]
public static ActionResult SomeAction(Session session)
{
if(Int32.Parse(session["UILevel"]) > 3)
{
var result = MessageBox.Show("Do something?", "Popup dialog", MessageBoxButtons.YesNo);
session["SOMEPROP"] = result == DialogResult.Yes ? "True" : "False";
}
return ActionResult.Success;
}