Вызов пользовательского действия в WIX при изменении значения в Combox - PullRequest
5 голосов
/ 04 августа 2011

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 07 августа 2011

Установщик 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, который используется для запуска настраиваемого действия при нажатии кнопки.Это может быть более уместным в вашем случае.

0 голосов
/ 17 февраля 2014

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

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

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

    <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>

Затем пользовательское действие выполняет то же сравнение, что и 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 () );
  }

(Примечание. Также необходимо использовать шаблон Twin Dialog, если обновляется, скажем, элемент управления listbox. Если ваш элемент управления не обновляется, но Next и Back ОБНОВЛЯЕТ его, то шаблон Twin Dialog обеспечит его обновление)

...