2016-06-28 55 views
0

是否可以在Wix更新對話框中的文本中進行自定義操作?我一直在尋找這樣做的各種方法,但沒有爲我工作。DoAction更新文本

我有

<Control Id="RunButton" Type="PushButton" X="0" Y="0" Height="18" Width="56" Text="Run"> 
    <Publish Event="DoAction" Value="CustomAction">1</Publish> 
</Control> 

定義的按鈕控制,並且具有

<Control Id="MessageText" X="0" Y="20" Width="100" Height="18"> 
    <Subscribe Event="ActionData" Attribute="Text" /> 
</Control> 

在我的自定義操作文本控件,我有

using(var rec = new Record(0)){ 
    rec.SetString(0, "Starting..."); 
    session.Message(InstallMessage.ActionData, rec); 
} 

這是基本的過程我在很多論壇上發現,但它不適合我。

該操作被定義爲Execute =「immediate」和Return =「Check」。

我也嘗試將「記錄」對象更改爲3個字段,並將字段1,2和3設置爲相同的屬性。這也不起作用。

任何人都可以解釋我做錯了什麼嗎?這在Wix中不可行嗎?基本上,我試圖在自定義操作中設置一個長時間運行的進程,並希望能夠向用戶報告操作的進度。

回答

2

如果您檢查DoAction文檔:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa368322(v=vs.85).aspx

它說,你無法通過MsiProcessMessage,這是什麼session.message實際上是下發送消息,所以這是最可能的原因因爲它不工作。我懷疑你正在查看的論壇描述了MsiProcessMessage的一般用法,沒有提到這個特殊情況。

不知道自定義操作在做什麼,我不能建議任何東西。在執行順序中,您可以將您的CA與進度欄集成在一起,但是您處於UI順序中,可能收集大量數據或檢查某些內容。

如果您的自定義操作更新系統,它應該在執行順序中作爲延遲自定義操作。這不僅會影響進度條並提供文本說明正在發生的事情,而且安裝可能會失敗,或者用戶可能會取消它,事務安裝的重點在於該失敗將會回滾,就好像安裝從未開始。這意味着您應該保存數據庫並將其恢復到回滾自定義操作中。您可能遇到的另一個問題是,用戶界面中的即時自定義操作未提升,因此您可能無法更新數據庫。不僅如此,靜默安裝會繞過UI,因此您的自定義操作將不會被調用,並且您的產品無法使用組策略或SCCM方法進行推出。

+0

我的意圖是有一個數據庫升級頁面(我使用SQLite作爲這個應用程序的數據源),並讓用戶點擊一個升級按鈕,這將調用一個自定義操作。我希望使用CA來加載我的數據庫升級過程,並在進程更改時附加事件偵聽器,以便將ActionData消息發送回安裝程序。使用VS2008的舊版Windows Installer,我們可以創建一個頁面,通過生成一個自定義對話框頁面來完成這個功能。我可以使用WPF做類似的事嗎? CA以模塊方式產生WPF窗口來處理進度? – CodeMonkey

1

Windows Installer的內部UI不會間接更新太多。從根本上說,您必須決定是否需要單個更新(更像您的描述),或者您是否在尋找進度信息(更像您的方法)。對於進度消息,您應該聽取PhilDW的回答,因爲這需要成爲執行順序的一部分。爲了響應UI事件(如用戶點擊一個按鈕)一次性更新,可以考慮使用性能和setProperty控制事件:

  • 你的控制應該顯示的文本,包括屬性引用如Pudding: [FLAVOR]
  • 您的DoAction控制事件可以設置一些屬性,甚至可以設置FLAVOR本身,但爲了清晰起見,我可能會建議FLAVOR_FROMDOACTION
  • 然後添加SetProperty控件事件,將FLAVOR設置爲[FLAVOR_FROMDOACTION]。這將更新控件的文本。