Взаимодействие Wix с условиями, свойствами и пользовательскими действиями
У меня проблема с настройкой включенного состояния кнопки в диалоге. Данная кнопка определяется как:
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
<Condition Action="disable">Validated = 0</Condition>
<Condition Action="enable"><![CDATA[Validated <> 0]]></Condition>
<Publish Event="EndDialog" Value="Return">1</Publish>
</Control>
Свойство Validated начинается с начального значения 0, и, как и ожидалось, следующая кнопка начинает отключаться.
<Property Id="Validated" Value="0"/>
Само свойство изменяется через пользовательское действие на другую кнопку.
<Control Id="PerformValidation" Type="PushButton" X="225" Y="75" Width="50" Height="20" Text="Validate">
<Publish Event="DoAction" Value="ValidateDB">1</Publish>
</Control>
С урезанной версией настраиваемого действия, например:
[CustomAction]
public static ActionResult ValidateDatabase(Session session)
{
session.Log("Begin ValidateDatabase");
session["Validated"] = "1";
return ActionResult.Success;
}
Проблема, с которой я сталкиваюсь, заключается в том, что кнопка "Далее" не включается снова после запуска настраиваемого действия. Я могу подтвердить, что CA работает, и свойство успешно установлено. Пользовательский интерфейс обновится, если я выполню какое-либо другое действие, которое вызывает его обновление, например, вернитесь на страницу, затем снова перейдите на эту страницу, и кнопка "Далее" будет включена.
Любые идеи о том, как обновить состояние кнопок после пользовательских действий?
2 ответа
http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg05097.html предлагает решение для повторной публикации свойств, которые были изменены в настраиваемом действии сразу после него.
Вот пример того, как я заставил это работать в моем коде:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<Binary Id="ConnectionStringExtension.dll" SourceFile="$(var.ConnectionStringExtension.TargetDir)$(var.ConnectionStringExtension.TargetName).CA.dll" />
<CustomAction Id="MyCustomAction" BinaryKey="ConnectionStringExtension.dll" DllEntry="VerifyConnectionString" Execute="immediate" />
<UI>
<Dialog Id="ConnectionStringDlg" Width="370" Height="270" Title="Database Settings - [ProductName]" NoMinimize="yes">
<Control Id="ConnectionStringLabel" Type="Text" X="45" Y="73" Width="100" Height="15" TabSkip="no" Text="&Connection String:" />
<Control Id="ConnectionStringEdit" Type="Edit" X="45" Y="95" Width="220" Height="15" Property="CONNECTION_STRING" Text="{200}" />
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="&Back">
</Control>
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="&Next">
<Condition Action="enable"><![CDATA[CONNECTION_STRING <> "" AND CONNECTION_STRING_VALID = "1"]]></Condition>
<Condition Action="disable"><![CDATA[CONNECTION_STRING = "" OR CONNECTION_STRING_VALID = "0"]]></Condition>
</Control>
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="Cancel">
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
</Control>
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" />
<Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
<Text>Please enter database configuration</Text>
</Control>
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
<Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
<Text>{\WixUI_Font_Title}Database Settings</Text>
</Control>
<Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
<Control Id="VerifyButton" Type="PushButton" Width="56" Height="16" X="45" Y="118" Text="Verify">
<Publish Event="DoAction" Value="MyCustomAction">1</Publish>
<Publish Property="TEMP_VERIFIED" Value="[CONNECTION_STRING_VALID]">1</Publish>
<Publish Property="CONNECTION_STRING_VALID" Value="[TEMP_VERIFIED]" />
</Control>
</Dialog>
</UI>
</Fragment>
</Wix>
CustomAction устанавливает значение CONNECTION_STRING_VALID равным 1 или 0, в зависимости от того, допустимо оно или нет, и в другом месте я определил, что по умолчанию его значение равно 0
<Property Id="CONNECTION_STRING_VALID" Value="0" />
Теперь, когда я нажимаю кнопку подтверждения, если строка действительна, активируется следующая кнопка.
Это хорошо известное ограничение установщика Windows. Состояние диалога не изменится, пока вы не обновите его любым другим способом, например, переместившись назад и вперед, как вы правильно упомянули.
Обходной путь здесь должен иметь два идентичных диалоговых окна, DialogA и DialogB. Кнопка PerformValidation на DialogA выполнит проверку, как сейчас, и вызовет DialogB (как NewDialog). Точно так же кнопка PerformValidation на DialogB также выполнит проверку и вызовет DialogA. Таким образом, вы будете иметь диалоги, которые будут загружаться каждый раз, когда вы запускаете проверку, и состояние кнопки будет отображаться правильно. Пользователь не будет ничего подозревать, потому что он увидит только тот же диалог.:-)
Идея подробно описана здесь. Это называется "двойными диалогами".
Надеюсь это поможет.