Я решил эту проблему в 3 частях:
- определение свойства OSWarningText
который устанавливается только при предупреждении
нужно дать
- создание пользовательского экрана предупреждения
- Вставка экрана предупреждения в последовательность пользовательского интерфейса, если необходимо.
1. Определение свойства OSWarningText
Сначала объявите свойство и присвойте ему значение по умолчанию «unset»:
<Property Id="OSWarningText" Value="{}"/>
Чтобы построить фактическое значение свойства, установите промежуточное свойство для каждого возможного предупреждения. Убедитесь, что условия для каждого предупреждения не перекрываются:
<SetProperty Id="OSWarningText1" After="AppSearch"
Value="Detected XP SP [ServicePackLevel]. SP3 or higher is recommended.">
<![CDATA[(VersionNT = 501) AND NOT (ServicePackLevel >= 3)]]>
</SetProperty>
<SetProperty Id="OSWarningText2" After="SetOSWarningText1"
Value="Detected Vista SP [ServicePackLevel]. SP2 or higher is recommended.">
<![CDATA[(VersionNT = 600) AND NOT (ServicePackLevel >= 2)]]>
</SetProperty>
Предполагая, что условия не пересекаются, мы можем безопасно сконцентрировать предупреждения в одном свойстве, таком как:
<SetProperty Id="OSWarningText" After="SetOSWarningText2"
Value="[OSWarningText1][OSWarningText2]" />
2. Создание пользовательского экрана предупреждения.
Это похоже на пример для добавления флажка для ярлыка на рабочем столе . Скопируйте одно из существующих диалоговых определений из источников wix , например, InstallDirDlg.wxs
и переименуйте его в WarningDlg.wxs
.
Установите идентификатор диалога в Id="WarningDlg
. Удалите ненужные элементы управления и замените их предупреждением и нашим ранее определенным OSWarningText:
<Control Id="OSWarning" Type="Text" X="100" Y="80" Width="250" Height="60"
NoPrefix="yes" Text="[OSWarningText]" />
<Control Id="WarningIcon" Type="Icon" X="20" Y="60" Width="64" Height="64"
Text="Warning.ico" >
<Binary Id="Warning.ico" SourceFile="..\icons\warning.ico"/>
</Control>
Идея состоит в том, чтобы создать что-то вроде этого:
3. Вставка пользовательского экрана предупреждения в пользовательском интерфейсе
Теперь нам нужно убедиться, что экран предупреждения отображается между диалоговым окном приветствия и диалоговым окном лицензионного соглашения, но только в том случае, если на самом деле есть предупреждение. Это особый случай более общей последовательности ветвления мастера проблема.
Снова скопируйте предопределенную последовательность пользовательского интерфейса из источников wix, например, WixUI_InstallDir.wxs
и переименуйте идентификатор пользовательского интерфейса в Id="MyWixUI"
. Назовите это в вашем основном файле wxs как <UIRef Id="MyWixUI" />
. Теперь найдите и отредактируйте обработчики событий для кнопки WelcomeDlg next.
Вы можете установить свойства в ответ на нажатие кнопки и дополнительное условие, и вы можете показать следующий диалог на основе свойства. Мы будем использовать это для обработки следующей кнопки WelcomeDlg следующим образом:
- сбросить свойство WelcomeDlg_Next
"сбросить"
- установить свойство WelcomeDlg_Next равным
«WarningDlg», но только если
OSWarningText установлен
- установить свойство WelcomeDlg_Next равным
"LicenseAgreementDlg", но только если
OSWarningText НЕ установлен.
- Показать диалог, заданный
WelcomeDlg_Next, если свойство было
правильно установлено.
Код Wix для этого выглядит так:
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="{}"
Order="1">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="WarningDlg"
Order="2">OSWarningText</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="LicenseAgreementDlg"
Order="3">NOT OSWarningText</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Event="NewDialog" Value="[WelcomeDlg_Next]"
Order="4">WelcomeDlg_Next</Publish>
Затем сделайте эквивалент для кнопки «назад» лицензионного соглашения: она должна вернуться к экрану приветствия, если нет предупреждения, или к экрану предупреждения.