Извикайте персонализирано действие в WIX при промяна на стойността в Combox

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

Имам разгъващ се списък (падащо меню), съдържащ няколко стойности. Искам да покажа някакъв текст на екрана (уникален за всеки елемент в падащото меню), когато потребителят избере стойност от това падащо меню.

В .Net можем да направим това лесно, тъй като имаме предварително дефинирани различни събития. Но в WIX не виждам такова събитие.

Някой сблъсквал ли се е със същия проблем? Или може да ме насочи как мога да го направя.


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


Отговори (2)


Windows Installer (основната технология) не ви позволява да го направите. Буквално, той не публикува никакво събитие, когато стойността на падащото меню се промени. Ще трябва да добавите бутон, например, върху който потребителят да щракне, когато той/тя промени стойността в падащия списък...

Като алтернатива можете да превключите към техниката 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 Installer. - person Yan Sklyarenko; 09.08.2011
comment
Пример за EmbeddedUI: msdn.microsoft.com/en-us/library/cc542588 .aspx. Обърнете внимание и на коментарите... - person Yan Sklyarenko; 09.08.2011

Има начин да направите това в WiX. Просто трябва да създадете свое собствено променено събитие.

Сравняваме нашето условие DoAction с друго свойство, което ще запази предишното състояние на Combobox - VIRTUALWEBSITEOLD

Изпълнете персонализирано действие в ComboBox, когато старото не е равно на ново:

    <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 Pattern, ако актуализирате, да речем, контрола със списък. Ако вашата контрола не се актуализира, но Next и Back го актуализира, тогава Twin Dialog Pattern ще гарантира, че се актуализира)

person RobG    schedule 17.02.2014