2013-10-28 249 views
0

我有兩個自定義對話框 - dlg1和dlg2。用戶點擊dlg1上的NEXT後,應顯示另一個帶有文本和確定按鈕的自定義彈出對話框。用戶點擊確定後彈出dlg2應該出現。我嘗試了很多東西,但最好的只是在dlg1和OK-popup上顯示dlg2。WIX彈出對話框

回答

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> 

UPDATE 實施上述解決方案會產生一些問題。儘管有一種解決方法,但它會使您的代碼不易讀。在發佈一些代碼之前,讓我先描述解決方法背後的概念。基本上你只會有兩個對話框:一個觸發彈出框和彈出框。在彈出窗口中,如上所述,您不打開新窗口,而是將焦點返回到調用對話框。另外你改變一個屬性的狀態。調用對話框將根據模態對話框設置的屬性進行更新。

爲了實現這個目標,您必須在調用對話框中爲每個狀態添加控件,一個用於屬性已設置的情況,另一個用於未設置屬性的情況。

爲callingDialog

代碼:

<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> 
+0

我試過了。一切看起來都不錯,直到你移動dlg2窗口 - 你會看到打開的dlg1和PopupDlg。有沒有辦法關閉它們? – user1016945

+0

啊,所以我們確實打破了一些規則。您可以更改PopupDlg中的發佈元素,查看我更新的答案。 – BdN3504

+0

不錯的解決方法!感謝您的解決方案! – user1016945

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