DoAction更新文本

时间:2016-06-28 15:25:55

标签: wix windows-installer

是否可以在对话框中的Wix更新文本中进行自定义操作?我一直在寻找各种方法来做这件事,但对我来说没有任何效果。

我有一个用

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

和一个

的Text控件
<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);
}

这是我在众多论坛上发现的基本过程,但它并不适用于我。

该行动被定义为执行=&#34;立即&#34;并返回=&#34;检查&#34;。

我也试过更改&#34;记录&#34; object为3个字段,并将相同的属性设置为字段1,2和3.这也不起作用。

有人能解释我做错了什么吗?这在Wix中是不可行的吗?本质上,我试图在自定义操作中设置一个长时间运行的进程,并希望能够向用户报告操作的进度。

2 个答案:

答案 0 :(得分:2)

如果您查看DoAction的文档:

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

它表示你不能通过MsiProcessMessage发送消息,这就是session.message实际上在底下的消息,因此它最不可能的原因是它不起作用。我怀疑您正在查看的论坛描述了MsiProcessMessage的一般用法,而没有对此特定情况的警告。

在不知道自定义操作正在做什么的情况下,我无法提出任何建议。在执行序列中,您可以将CA与进度条集成,但是您在UI序列中,可能会收集大量数据或检查某些内容。

如果您的自定义操作更新了系统,则它应该在执行序列中作为延迟自定义操作。这不仅可以让你影响进度条并提供文字说明发生了什么,但是安装可能会失败,或者用户可能会取消它,事务安装的重点是失败会将其回滚为如果安装从未开始。这意味着您应该保存数据库并在回滚自定义操作中将其还原。您可能遇到的另一个问题是UI中的立即自定义操作未提升,因此您可能无法更新数据库。不仅如此,静默安装会绕过用户界面,因此无法使用组策略或SCCM方法调用您的自定义操作,也无法推出您的产品。

答案 1 :(得分:1)

Windows Installer的内部UI不会间接更新。从根本上说,您必须决定是否需要单次更新(更像是您的描述),或者您是否正在寻找进度消息(更像您的方法)。对于进度消息,您应该注意PhilDW的答案,因为这需要成为执行序列的一部分。对于响应UI事件的一次性更新(例如用户单击按钮),请考虑使用属性和SetProperty控件事件:

  • 您的控件应显示包含属性引用的文本,例如Pudding: [FLAVOR]
  • 您的DoAction控制事件可以设置一些属性,甚至可能是FLAVOR本身,但为了清楚起见,我可能会建议FLAVOR_FROMDOACTION
  • 然后添加一个SetProperty控件事件,将FLAVOR设置为[FLAVOR_FROMDOACTION]。这将更新控件的文本。