Редактирование элемента управления не обновляется с помощью пользовательского действия 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>
Другие вопросы по тегам