在WIX安装程序中遇到了组合框和自定义操作。
我有一个包含很少值的组合框(下拉列表)。当用户从此下拉列表中选择一个值时,我想在屏幕上显示一些文本(下拉列表中每个项目都是唯一的。)
在.Net中,我们可以轻松完成此操作,因为我们预先定义了不同的事件。但在WIX中,我没有看到任何此类事件。
有人遇到同样的问题吗?或者可以指导我如何完成它。
答案 0 :(得分:8)
Windows Installer(基础技术)不允许您这样做。从字面上看,当组合框(下拉列表)值发生变化时,它不会发布任何事件。例如,您必须添加一个按钮,以便用户在更改组合框中的值时单击...
或者,您可以切换到EmbeddedUI技术(WiX element和MSI 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将确保它更新)