Свойство WiX Checkbox работает только при заданном значении по умолчанию

Насколько я понимаю, в WiX установлен флажок, если свойство не равно нулю. Таким образом, чтобы установить флажок по умолчанию "Checked", свойство должно быть определено отдельно от флажка.

Учитывая это, у меня есть флажок, который позволяет пользователю выбирать, хотят ли они добавить ярлык на свой рабочий стол. Первоначально он был настроен для проверки по умолчанию, но сейчас я пытаюсь изменить его, чтобы он не проверялся по умолчанию. Однако, когда я удаляю определение свойства, чтобы оно не было проверено, опция больше не работает. Установщик не будет добавлять ярлык, независимо от того, установлен флажок или нет. Вот как изначально был установлен флажок:

<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)

Может кто-нибудь сказать мне, почему удаление значения по умолчанию приводит к тому, что опция перестает работать? И / или как заставить его работать?

2 ответа

{} не может использоваться в таблице свойств или в настраиваемом действии типа 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"/>

Если вы работаете с условием компонента, вы должны знать, что компонент установлен, если условие имеет значение null или имеет значение true (не уверен насчет этого нулевого значения, но именно об этом говорит 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 и работает нормально.

Крис, вероятно, говорит о графическом интерфейсе настройки (диалоги отображаются после завершения версии CostFinalize с графическим интерфейсом), и в этом случае вы должны использовать Set Property ControlEvent вместо настраиваемого действия Set Property - как он утверждает (я не удосужился протестировать Set Property пользовательские действия здесь).


Приведенное ниже больше не актуально, поскольку вы, похоже, отказались от использования условной функции, но в отношении вашего первоначального вопроса: "Может кто-нибудь сказать мне, почему удаление значения по умолчанию приводит к тому, что опция перестает работать?"

Условие: Когда вы не установите 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 с условием, которое оценивается как истинное. Таким образом, эта функция может быть скрыта при обычной установке, но все функции - со связанными файлами - извлекаются во время установки администратора.

Другие вопросы по тегам