Wix CustomAction更新UI?

时间:2011-02-11 20:04:23

标签: wix controls custom-action

如果我有托管的Wix自定义操作,那么我是否可以使用文本类型更新Control?我看到可以使用session.MessageInstallMessage.Progress来更新进度条,但我没有看到更新其他用户界面的方法。

2 个答案:

答案 0 :(得分:4)

对于文本控件,您可以使用括在括号中的属性:[SOMEPROP]

然后在您的CA中,您可以说会话[“SOMEPROP”] =“somevalue”。注意MSI很难刷新UI,因此您几乎必须从一个对话框转换到另一个对话框才能使其工作。换句话说,在上一个对话框的下一个按钮上调用CA,在下一个对话框中,文本控件将显示文本。

答案 1 :(得分:4)

我找到了一个完成此操作的解决方案,无需转换对话框以使其更新。

在自定义操作中,设置属性。下面,我设置INSTALLFOLDER

[CustomAction]
public static ActionResult SpawnBrowseFolderDialog(Session session)
{
    session.Log("Started the SpawnBrowseFolderDialog custom action.");
    try
    {
        Thread worker = new Thread(() =>
        {
            FolderBrowserDialog dialog = new FolderBrowserDialog();
            dialog.SelectedPath = session["INSTALLFOLDER"];
            DialogResult result = dialog.ShowDialog();
            session["INSTALLFOLDER"] = dialog.SelectedPath;
        });
        worker.SetApartmentState(ApartmentState.STA);
        worker.Start();
        worker.Join();
    }
    catch (Exception exception)
    {
        session.Log("Exception while trying to spawn the browse folder dialog. {0}", exception.ToString());
    }
    session.Log("Finished the SpawnBrowseFolderDialog custom action.");
    return ActionResult.Success;
}

Product.wxs文件中,请确保Publish该属性返回用户界面,以便更新编辑框:

<Control Id="FolderEdit" Type="PathEdit" X="18" Y="126" Width="252" Height="18" Property="INSTALLFOLDER" Text="{\VSI_MS_Sans_Serif13.0_0_0}MsiPathEdit" TabSkip="no" Sunken="yes" />
<Control Id="BrowseButton" Type="PushButton" X="276" Y="126" Width="90" Height="18" Text="{\VSI_MS_Sans_Serif13.0_0_0}B&amp;rowse..." TabSkip="no">
    <Publish Event="DoAction" Value="SpawnBrowseFolderDialog"><![CDATA[1]]></Publish>
    <Publish Property="INSTALLFOLDER" Value="[INSTALLFOLDER]"><![CDATA[1]]></Publish>
</Control>

换句话说,您执行操作,然后必须将该属性发布回自身以调用控件中的更新。