WIX弹出对话框

时间:2013-10-28 08:45:15

标签: wix wix3.7

我有两个自定义对话框 - dlg1和dlg2。用户在dlg1上单击NEXT后,应显示另一个带有一些文本和OK按钮的自定义弹出对话框。用户在此弹出窗口中单击“确定”后,应显示dlg2。我尝试了很多东西,但最好的只是在dlg1和OK-popup上显示dlg2。

2 个答案:

答案 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;       
}