1

据我了解,在 WiX 中,如果属性不为空,则会检查一个复选框。因此,为了将复选框默认为“已选中”,必须在复选框之外定义属性。

鉴于此,我有一个复选框,允许用户选择是否要将快捷方式添加到桌面。最初它被设置为默认检查,但我现在正在尝试更改它,以便默认情况下未选中。但是,当我删除属性定义以使其不被检查时,该选项不再起作用。无论复选框是否选中,安装程序都不会添加快捷方式。下面是最初定义复选框的方式:

<Property Id="ADD_DESKTOP_SHORTCUT" Value="1" />

<Control Id="ShortcutCheckbox"
         Type="Checkbox"
         Property="ADD_DESKTOP_SHORTCUT"
         CheckBoxValue="1"
         Integer="yes"
         Text="Add Desktop Shortcut" />

桌面快捷方式功能定义如下:

<Feature Id="DesktopShortcut" Title="Desktop Shortcut" Level="0">
  <ComponentRef Id="CMP_DesktopShortcut" />
  <Condition Level="1">
    <![CDATA[(ADD_DESKTOP_SHORTCUT) or (REMOVE = "ALL")]]>
  </Condition>
</Feature>

以上方法有效,但一旦我删除<Property Id="ADD_DESKTOP_SHORTCUT" Value="1" />它,无论复选框选择如何,都不再添加快捷方式。

我也尝试过定义属性,但改变它的值是这样的:

<Property Id="ADD_DESKTOP_SHORTCUT" Value="{}" />

这也不起作用。我得到一个错误。(错误代码 2892)

谁能告诉我为什么删除默认值会导致选项停止工作?和/或如何让它工作?

4

2 回答 2

1

{}不能在属性表或类型 51 setproperty 自定义操作中使用。它仅适用于 setproperty 控制事件。您可以通过简单地声明它而不给它一个值来设置该属性。

<Control Id="Custom" Type="CheckBox" X="20" Y="80" Width="320" Height="18" Property="MYPROPERTY" CheckBoxValue="Checked"/>
<Property Id="MYPROPERTY" Secure="yes"/>
于 2018-04-23T18:11:59.553 回答
0

如果您使用组件条件,您应该知道如果条件为null或计算结果为true ,则安装组件(不确定那个 null 的东西,但这就是SDK 所说的)。

我建议检查一个实际值以避免空陷阱:

  <Property Id="ADD_DESKTOP_SHORTCUT" Secure="yes" Transitive="yes" />

  <Component Id="CMP_DesktopShortcut">
     <...>
     <Condition>ADD_DESKTOP_SHORTCUT="1"</Condition>
  </Component>

所以这ADD_DESKTOP_SHORTCUT="1"不仅仅是ADD_DESKTOP_SHORTCUT. 您显然可以包含Value="1"属性元素以使安装快捷方式成为默认设置。

请注意,我设置Transitive="yes"的原因是您可能允许此设置在运行时在安装程序的维护对话框中更改(不仅仅是安装对话框),然后您可以重新评估组件状况 - 如果用户更改了选择。(传递性:“如果设置了此位,安装程序会在重新安装时重新评估条件列中语句的值”。)

我假设您安装ALLUSERS=1了每台机器(另一个用户)。

设置属性自定义操作”类型 51)确实可以取消定义属性,方法是将其值设置为等于{}提供它之前运行的CostFinalize. 我刚刚测试了这个InstallExecuteSequence,它工作正常。

Chris 可能在谈论设置 GUI(CostFinalize 的 GUI 版本完成后显示对话框),在这种情况下,您应该使用SetProperty ControlEvent而不是 SetProperty 自定义操作 - 正如他所说(我没有费心测试 SetProperty此处的自定义操作)。


以下不再相关,因为您似乎已经放弃使用条件功能,但关于您最初的问题:“谁能告诉我为什么删除默认值会导致选项停止工作?

功能条件:当您根本不设置ADD_DESKTOP_SHORTCUT属性时,您的功能条件不正确,因此您的功能不会从其默认安装级别 0(不安装)切换到安装级别 1(安装):

<Feature Id="DesktopShortcut" Title="Desktop Shortcut" Level="0">
 <Condition Level="1">
     <![CDATA[(ADD_DESKTOP_SHORTCUT) or (REMOVE = "ALL")]]>    <= True only on uninstall
 </Condition>
</Feature>

功能条件问题Level=0:请注意,在管理安装期间根本不会提取任何设置为默认值的功能老实说,这很疯狂,但似乎是管理员安装当前的工作方式。我看不出这种设计有什么好处。

您可以Level=0通过设置Level=1为默认值来避免将任何功能设置为,然后Level=0使用评估为 true 的功能条件将它们设置为。这样,该功能可能会在常规安装中隐藏,但所有功能 - 以及相关文件 - 在管理员安装期间都会被提取。

于 2018-04-24T00:17:35.230 回答