Редактирование элемента управления не обновляется с помощью пользовательского действия C# в WIX
У меня есть пользовательский интерфейс с Edit
Я хочу обновить его с помощью пользовательского действия aC#, которое вызывается нажатием кнопки.
Это тестовый фрагмент WIX, который я создал, чтобы продемонстрировать вам проблему, он содержит объявления пользовательского интерфейса и пользовательских действий.
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI>
<Dialog Id="TestDlg" Width="370" Height="270">
<Control Id="TextBox" Type="Edit" X="80" Y="117" Height="17" Width="250" Property="EDITBOXVALUE" Text="[EDITBOXVALUE]"/>
<Control Id="Button" Type="PushButton" X="331" Y="117" Height="16" Width="17" Text="Update">
<Publish Event="DoAction" Value="UpdateEditBox" Order="1">1</Publish>
<!-- This is a workaround to update property I found here https://legalizeadulthood.wordpress.com/2009/10/23/ui-custom-action-guidelines/ -->
<Publish Property="EDITBOXVALUE" Value="[EDITBOXVALUE]" Order="2">1</Publish>
</Control>
</Dialog>
</UI>
<Binary Id="ServerActions" SourceFile="$(var.CustomActions.TargetDir)$(var.CustomActions.TargetName).CA.dll" />
<CustomAction Id="UpdateEditBox" BinaryKey="ServerActions" DllEntry="UpdateEditBox" Execute="immediate" Return="check" />
</Fragment>
</Wix>
Это C# настраиваемое действие:
[CustomAction]
public static ActionResult UpdateEditBox(Session session)
{
session ["EDITBOXVALUE"] = "Updated Value";
return ActionResult.Success;
}
Теперь вот проблема, с которой я сталкиваюсь, если я просто нажимаю на кнопку, поле редактирования обновляется, НО, если я сначала помещаю некоторый текст в поле редактирования, ТО ТОЛЬКО нажимаю кнопку, поле редактирования больше не обновляется.
Я проверил журналы установки (запустив установщик с этой командой msiexec.exe /i MyInstaller.msi /l*vx Output.txt
) и вот что я нашел:
MSI (c) (FC!24) [17:13:41:225]: PROPERTY CHANGE: Adding EDITBOXVALUE property. Its value is 'Updated Value'.
MSI (c) (FC:44) [17:13:41:236]: Closing MSIHANDLE (1) of type 790542 for thread 9980
Action ended 17:13:41: UpdateEditBox. Return value 1.
MSI (c) (FC:FC) [17:13:44:521]: PROPERTY CHANGE: Modifying EDITBOXVALUE property. Its current value is 'Updated Value'. Its new value: 'NEW VALUE I TYPED INTO EDIT BOX'.
MSI (c) (FC:FC) [17:13:44:633]: Doing action: UpdateEditBox
Action 17:13:44: UpdateEditBox.
Action start 17:13:44: UpdateEditBox.
MSI (c) (FC:FC) [17:13:44:635]: Creating MSIHANDLE (5) of type 790542 for thread 9980
MSI (c) (FC:6C) [17:13:44:635]: Invoking remote custom action. DLL: C:\Users\MYKHAI~1.SEN\AppData\Local\Temp\MSIAAE1.tmp, Entrypoint: UpdateEditBox
MSI (c) (FC!A0) [17:13:44:666]: Creating MSIHANDLE (6) of type 790531 for thread 27552
MSI (c) (FC!A0) [17:13:44:666]: Closing MSIHANDLE (6) of type 790531 for thread 27552
MSI (c) (FC!A0) [17:13:44:710]: Creating MSIHANDLE (7) of type 790531 for thread 27552
MSI (c) (FC!A0) [17:13:44:710]: Closing MSIHANDLE (7) of type 790531 for thread 27552
MSI (c) (FC!A0) [17:13:44:745]: Creating MSIHANDLE (8) of type 790531 for thread 27552
MSI (c) (FC!A0) [17:13:44:748]: Closing MSIHANDLE (8) of type 790531 for thread 27552
MSI (c) (FC!A0) [17:13:49:399]: PROPERTY CHANGE: Modifying EDITBOXVALUE property. Its current value is 'NEW VALUE I TYPED INTO EDIT BOX'. Its new value: 'Updated Value'.
MSI (c) (FC:6C) [17:13:49:425]: Closing MSIHANDLE (5) of type 790542 for thread 9980
Action ended 17:13:49: UpdateEditBox. Return value 1.
Action 17:13:52: CancelDlg. Dialog created
Action ended 17:13:53: WelcomeDlg. Return value 2.
Основываясь на этом журнале, кажется, что свойство было обновлено, тем не менее, оно не было отражено в пользовательском интерфейсе.
Кто-нибудь знает, что здесь происходит, и как я могу это исправить?
1 ответ
Это небольшая хитрость, с которой я столкнулся, чтобы преодолеть эту проблему, не очень элегантная, но, тем не менее, она работает.
Основная идея заключается в том, что у вас есть точная копия основного диалога, и когда вы хотите обновить пользовательский интерфейс, при изменении свойства вы просто переключаетесь между этими двумя копиями. Из примера в вопросе, он хотел бы что-то вроде этого:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI>
<Dialog Id="TestDlg" Width="370" Height="270">
<Control Id="TextBox" Type="Edit" X="80" Y="117" Height="17" Width="250" Property="EDITBOXVALUE" Text="[EDITBOXVALUE]"/>
<Control Id="Button" Type="PushButton" X="331" Y="117" Height="16" Width="17" Text="Update">
<Publish Event="DoAction" Value="UpdateEditBox" Order="1">1</Publish>
</Control>
</Dialog>
</UI>
<UI>
<Dialog Id="TestCopyDlg" Width="370" Height="270">
<Control Id="TextBox" Type="Edit" X="80" Y="117" Height="17" Width="250" Property="EDITBOXVALUE" Text="[EDITBOXVALUE]"/>
<Control Id="Button" Type="PushButton" X="331" Y="117" Height="16" Width="17" Text="Update">
<Publish Event="DoAction" Value="UpdateEditBox" Order="1">1</Publish>
</Control>
</Dialog>
</UI>
<Binary Id="ServerActions" SourceFile="$(var.CustomActions.TargetDir)$(var.CustomActions.TargetName).CA.dll" />
<CustomAction Id="UpdateEditBox" BinaryKey="ServerActions" DllEntry="UpdateEditBox" Execute="immediate" Return="check" />
</Fragment>
</Wix>
Обратите внимание, что я больше не использую это <Publish Property="EDITBOXVALUE" Value="[EDITBOXVALUE]" Order="2">1</Publish>
потому что это больше не нужно, потому что мы переключаемся на другой интерфейс.
И тогда где-нибудь в вашей последовательности пользовательского интерфейса у вас будет:
<Publish Dialog="TestDlg" Control="Button" Event="NewDialog" Value="TestCopyDlg">1</Publish>
<Publish Dialog="TestCopyDlg" Control="Button" Event="NewDialog" Value="TestDlg">1</Publish>