我是Wix烧伤的新手。我正在制作一个带有多个msi的wix Bootstrapper应用程序(BA)以及一个包含一个带复选框和一个按钮 install 的面板的UI。每个复选框都会邀请用户选择/取消选择msi,然后用户按下“Install”,我的BA应该安装已检查的msi。
在主.wxs文件中的 Chain 元素中,我计划使用带有条件属性的 MsiPackage 元素来确定是或是没有用户选择它。
现在我的问题是:如何将这些条件属性与复选框相关联?或者换句话说:如何将复选框信息导入Wix .wxs文件?
答案 0 :(得分:2)
我可以解释一下我是怎么做到的。愿有更好的方法。 我的checkBox绑定到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.wxs中我有:
<Wix ...>
<Bundle ...>
...
<Chain>
...
<MsiPackage>
...
<MsiProperty Name="InstallApp1" Value="[InstallApp1]"/>
<MsiProperty Name="InstallApp2" Value="[InstallApp2]"/>
<MsiProperty Name="InstallApp3" Value="[InstallApp3]"/>
...
</MsiPackage>
</Chain>
</Bundle>
</Wix>
通过使用标记,可以在wsx文件中使用ViewModel类的属性。 然后,这些值在我的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.这意味着该应用程序不会是istalled。 但是如果在条件标签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>
我希望你明白这一点。