DoAction для обновления текста

Можно ли настраивать действие в тексте обновления 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>

и текстовый элемент управления, который имеет

<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="немедленное" и Return="Проверка".

Я также попытался изменить объект "Запись" на 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, предположительно собирая много данных или проверяя что-то.

Если ваше настраиваемое действие обновляет систему, оно должно быть в последовательности выполнения как отложенное настраиваемое действие. Мало того, что это позволяет вам влиять на индикатор выполнения и предоставлять текст, говорящий о том, что происходит, но установка может завершиться неудачно, или пользователь может отменить ее, весь смысл транзакционной установки состоит в том, что сбой откатит ее, как если бы установка никогда не выполнялась началось. Это означает, что вы должны сохранить базу данных и восстановить ее в пользовательском действии отката. Другая проблема, с которой вы можете столкнуться, заключается в том, что немедленные пользовательские действия в пользовательском интерфейсе не повышены, поэтому вы не сможете обновить базу данных. Кроме того, автоматическая установка обходит пользовательский интерфейс, поэтому ваше пользовательское действие не будет вызываться, и ваш продукт нельзя будет развернуть с помощью групповой политики или методов SCCM.

Внутренний интерфейс установщика Windows не сильно обновляется. По сути, вы должны решить, хотите ли вы одно обновление (больше похоже на ваше описание), или вы ищете сообщения о прогрессе (больше похоже на ваш подход). Для сообщений о прогрессе вы должны прислушаться к ответу PhilDW, так как это должно быть частью последовательности выполнения. Для одноразовых обновлений в ответ на события пользовательского интерфейса (например, пользователь нажимает кнопку) рассмотрите возможность использования свойств и событий управления SetProperty:

  • Ваш элемент управления должен отображать текст, включая ссылку на свойство, такую ​​как Pudding: [FLAVOR],
  • Ваше управляющее событие DoAction может установить какое-либо свойство, возможно, даже FLAVOR сам, но для ясности я мог бы предложить FLAVOR_FROMDOACTION,
  • Затем добавьте событие управления SetProperty, которое устанавливает FLAVOR в [FLAVOR_FROMDOACTION], Это обновит текст элемента управления.
Другие вопросы по тегам