Вызов пользовательского действия в WIX при изменении значения в Combox

Застрял с полем со списком и пользовательским действием в установщике WIX.

У меня есть поле со списком (выпадающее), содержащее несколько значений. Я хочу показать текст на экране (уникальный для каждого элемента в раскрывающемся списке), когда пользователь выбирает значение из этого раскрывающегося списка.

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

Кто-нибудь сталкивался с такой же проблемой? Или может подсказать, как мне это сделать.


person Sunil Agarwal    schedule 04.08.2011    source источник


Ответы (2)


Установщик Windows (основная технология) не позволяет вам сделать это. Буквально, он не публикует никаких событий при изменении значения поля со списком (выпадающего списка). Вам нужно будет добавить кнопку, например, чтобы пользователь мог щелкнуть, когда он / она изменил значение в поле со списком...

Кроме того, вы можете переключиться на технику EmbeddedUI (элемент WiX и таблица MSI), но она гораздо более продвинутая...

ОБНОВЛЕНИЕ: пример использования кнопки для обновления текста.

<UI>
  ...
  <ComboBox Property="WIX_VERSIONS">
    <ListItem Value="Windows Installer XML 3.0" />
    <ListItem Value="Windows Installer XML 3.5" />
    <ListItem Value="Windows Installer XML 3.6" />
  </ComboBox>
  ...
  <Dialog Id="MyCustomDlg">
    ...
      <Control Id="ComboBoxMain" Type="ComboBox" X="10" Y="60" Width="300" Height="17" Property="WIX_VERSIONS" />
      <Control Id="ButtonMain" Type="PushButton" X="320" Y="60" Width="40" Height="17" Text="Show">
        <Publish Property="COMBOVALUEFORMATTED" Value="You've chosen the [WIX_VERSIONS] version of the toolset" />
      </Control>
      <Control Id="LabelMain" Type="Text" X="10" Y="80" Width="360" Height="17" Property="COMBOVALUEFORMATTED" Text="[COMBOVALUEFORMATTED]" />
    ...
  </Dialog>
</UI>

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

person Yan Sklyarenko    schedule 07.08.2011
comment
не могли бы вы предоставить мне пример для того же? - person Sunil Agarwal; 08.08.2011
comment
это я знаю, но с помощью какого-то внешнего инструмента или чего-то еще я не могу добиться того, чего я именно хочу? - person Sunil Agarwal; 09.08.2011
comment
Да, ты можешь. Вариант 1: создайте пользовательское приложение, которое само будет обрабатывать всю логику мастера, и вызовите msiexec с вашим пакетом в самом конце, когда вы соберете всю информацию от пользователя/системы. Вариант 2: используйте метод EmbeddedUI, о котором я упоминал выше (это поддерживается, начиная с MSI 4.5 и выше, и требует создания специальной DLL для обработки всей логики пользовательского интерфейса). Оба варианта имеют свои преимущества и недостатки, оба являются обходными путями ограничений пользовательского интерфейса установщика Windows. - person Yan Sklyarenko; 09.08.2011
comment
Образец EmbeddedUI: msdn.microsoft.com/en-us/library/cc542588. .aspx. Обратите внимание и на комментарии... - person Yan Sklyarenko; 09.08.2011

В WiX есть способ сделать это. Вам просто нужно создать собственное измененное событие.

Мы сравниваем наше условие DoAction с другим свойством, которое будет содержать предыдущее состояние поля со списком — VIRTUALWEBSITEOLD.

Выполните пользовательское действие в поле со списком, когда старое не равно новому:

    <Control Id="WebSite" Type="ComboBox" Width="180" Height="18" X="120" Y="48" ComboList="no" Property="VIRTUALWEBSITE">
       <Publish Event="DoAction" Value="LansaInitVirtualFolders"><![CDATA[VIRTUALWEBSITE <> VIRTUALWEBSITEOLD]]></Publish>
    </Control>

Затем Custom Action выполняет то же сравнение, что и DoAction (вероятно, не обязательно), а затем сохраняет значение Combobox в свойстве OLD.

  Tstring wszWebsite = ReadProperty( _T( "VIRTUALWEBSITE") );
  Tstring wszWebsiteOld = ReadProperty( _T ( "VIRTUALWEBSITEOLD" ) );

  // If unchanged ignore request
  if ( wszWebsite == wszWebsiteOld ) return true ;

 [Do Some stuff]

  // Set the saved state of the combobox so we don't get called again until it changes
  if ( nResult == ERROR_SUCCESS || nResult == ERROR_NO_MORE_ITEMS)
  {
     WriteProperty( _T("VIRTUALWEBSITEOLD" ), wszWebsite.c_str () );
  }

(Примечание. Также необходимо использовать шаблон двойного диалога при обновлении, скажем, элемента управления списком. Если ваш элемент управления не обновляется, но «Далее» и «Назад» обновляет его, тогда шаблон двойного диалога обеспечит его обновление)

person RobG    schedule 17.02.2014