在Combone中更改值时,在WIX中调用自定义操作

时间:2011-08-04 10:23:27

标签: combobox installer wix wix3.5

在WIX安装程序中遇到了组合框和自定义操作。

我有一个包含很少值的组合框(下拉列表)。当用户从此下拉列表中选择一个值时,我想在屏幕上显示一些文本(下拉列表中每个项目都是唯一的。)

在.Net中,我们可以轻松完成此操作,因为我们预先定义了不同的事件。但在WIX中,我没有看到任何此类事件。

有人遇到同样的问题吗?或者可以指导我如何完成它。

2 个答案:

答案 0 :(得分:8)

Windows Installer(基础技术)不允许您这样做。从字面上看,当组合框(下拉列表)值发生变化时,它不会发布任何事件。例如,您必须添加一个按钮,以便用户在更改组合框中的值时单击...

或者,您可以切换到EmbeddedUI技术(WiX elementMSI table),但它更先进......

更新:使用按钮单击以更新文本的示例。

<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,用于在按钮点击时运行自定义操作。这可能与您的情况更相关。

答案 1 :(得分:0)

有一种方法可以在WiX中执行此操作。你只需要制作自己改变的活动。

我们将DoAction条件与将保持Combobox之前状态的另一个属性进行比较 - VIRTUALWEBSITEOLD

当旧版本不等于new时,在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 DOES更新它,那么Twin Dialog Pattern将确保它更新)