我是Wix burn的新手。我正在制作一个wix Bootstrapper应用程序(BA)与多个msi安装和一个由一个面板与复选框和一个按钮安装组成的UI。每个复选框邀请用户选择/取消选择一个msi,然后用户按"安装",我的BA应该安装选中的msi。
在主.wxs文件中的Chain元素中,我计划使用具有条件属性的MsiPackage元素来确定用户是否选择了它。现在我的问题是:如何将这些条件属性与复选框连接起来?或者换句话说:如何将复选框信息获取到Wix .wxs文件中?
我可以解释我是怎么做的。也许有更好的办法。我的复选框被绑定到ViewModel类中的属性。当在属性的setter中更改checkBox值时,我设置了一个变量的值在Bundle中定义。wxs文件。
private bool _installApp1Checked;
public bool InstallApp1Checked
{
get { return _installApp1Checked; }
set
{
_installApp1Checked = value;
if (value == true)
{
Bootstrapper.Engine.StringVariables["InstallApp1"] = "1";
}
else
{
Bootstrapper.Engine.StringVariables["InstallApp1"] = string.Empty;
}
RaisePropertyChanged("InstallApp1Checked");
}
}
private bool _installApp2Checked;
public bool InstallApp2Checked
{
get { return InstallApp2Checked; }
set
{
_installApp2Checked = value;
if (value == true)
{
Bootstrapper.Engine.StringVariables["InstallApp2"] = "1";
}
else
{
Bootstrapper.Engine.StringVariables["InstallApp2"] = string.Empty;
}
RaisePropertyChanged("InstallApp2Checked");
}
}
private bool _installApp3Checked;
public bool InstallApp3Checked
{
get { return _installApp3Checked; }
set
{
_installApp3Checked = value;
if (value == true)
{
Bootstrapper.Engine.StringVariables["InstallApp3"] = "1";
}
else
{
Bootstrapper.Engine.StringVariables["InstallApp3"] = string.Empty;
}
RaisePropertyChanged("InstallApp3Checked");
}
}
在Bundle中。为什么我有:
<Wix ...>
<Bundle ...>
...
<Chain>
...
<MsiPackage>
...
<MsiProperty Name="InstallApp1" Value="[InstallApp1]"/>
<MsiProperty Name="InstallApp2" Value="[InstallApp2]"/>
<MsiProperty Name="InstallApp3" Value="[InstallApp3]"/>
...
</MsiPackage>
</Chain>
</Bundle>
</Wix>
通过使用标签,ViewModel类的属性可以在wsx文件中使用。然后在我的product.wxs:
中安装时可以使用这些值。<Product >
...
<Property Id="InstallApp1">
</Property>
<Property Id="InstallApp2">
</Property>
<Property Id="InstallApp3">
</Property>
<Feature Id="ProductFeature" Title="Alvenos" Level="0">
<ComponentRef Id="ProductComponents" />
<Condition Level="1">InstallApp1</Condition>
</Feature>
<Feature Id="AlvenosVSIXFeature" Title="Alvenos" Level="0">
<ComponentRef Id="AlvenosVsix" />
<Condition Level="1">InstallApp2</Condition>
</Feature>
<Feature Id="AlvenosServerVSIXFeature" Title="Alvenos" Level="0">
<ComponentRef Id="AlvenosServerVsix" />
<Condition Level="1">InstallApp3</Condition>
</Feature>
...
</Product>
可以看到Feature标签的Level属性的默认值被设置为0。这意味着该应用程序不会被安装。但如果在条件标签InstallApp[1],[2]或[3]设置为1,则Level设置为1,应用程序被安装。使用ComponentRef来引用一个Component标签,该标签将包含关于你要安装的应用程序的目标文件夹的信息。
<Fragment>
<ComponentGroup Id="InstallApp1" Directory="[target directory id]>
<Component Id="ProductComponent">
<File Source="[your app part of the installer]" />
</Component>
...
</Fragment>
我希望你能明白。