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