Wix CustomAction обновить пользовательский интерфейс?

Если у меня есть управляемое настраиваемое действие Wix, могу ли я обновить элемент управления с типом текста? Я вижу, что индикатор выполнения может быть обновлен с помощью session.Message с InstallMessage.Progress, но я не вижу способа обновления другого интерфейса.

2 ответа

Решение

Для текстового элемента управления вы можете использовать свойство, заключенное в квадратные скобки: [SOMEPROP]

Тогда в вашем CA вы можете сказать session["SOMEPROP"] = "somevalue". Обратите внимание, что MSI удивительно обновляет пользовательский интерфейс, поэтому вам придется переходить от одного диалога к другому, чтобы это работало. Другими словами, на следующей кнопке предыдущего диалога вызовите CA и в следующем диалоге текстовый элемент управления отобразит текст.

Я нашел решение, чтобы сделать это без необходимости переходить в диалоговые окна, чтобы заставить его обновить.

В ваших пользовательских действиях установите свойство. Ниже я установил 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>

Другими словами, вы выполняете действие, затем вы должны опубликовать свойство обратно на себя, чтобы вызвать обновление в элементе управления.

Другие вопросы по тегам