2010-11-22 14 views
14

Tengo un problema con la configuración del estado habilitado de un botón en un cuadro de diálogo. El botón en cuestión se define como:Wix Interacciones con condiciones, propiedades y acciones personalizadas

<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> 

La propiedad Validado comienza en un valor inicial de 0, y como se esperaba en el botón junto comienza con discapacidad.

<Property Id="Validated" Value="0"/> 

La propiedad se modifica mediante una acción personalizada en otro botón.

<Control Id="PerformValidation" Type="PushButton" X="225" Y="75" Width="50" Height="20" Text="Validate"> 
<Publish Event="DoAction" Value="ValidateDB">1</Publish> 
</Control> 

Con una versión simplificada de la acción personalizada como:

[CustomAction] 
public static ActionResult ValidateDatabase(Session session) 
{ 
session.Log("Begin ValidateDatabase"); 
session["Validated"] = "1"; 
return ActionResult.Success; 
} 

El problema que enfrentamos es que el botón Siguiente no vuelva a habilitar en sí después de la acción personalizada se ha ejecutado. Puedo confirmar que la CA se ejecuta y que la propiedad se configuró correctamente. La IU se actualizará si realizo alguna otra acción que haga que se actualice, p. vuelve una página y vuelve a esta página y el botón Siguiente se habilitará.

¿Alguna idea sobre cómo actualizar un estado de botones después de una acción personalizada?

Respuesta

15

http://www.mail-archive.com/[email protected]/msg05097.html ofrece una solución para volver a publicar las propiedades que se cambiaron en la acción personalizada inmediatamente después.

Aquí es un ejemplo de cómo he conseguido que funcione en mi código:

<?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="&amp;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="&amp;Back"> 
       </Control> 
       <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="&amp;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> 

El CustomAction establece el valor de CONNECTION_STRING_VALID a 1 o 0 dependiendo de si es válido o no y yo han definido en otro lugar que por defecto su valor es 0

<Property Id="CONNECTION_STRING_VALID" Value="0" /> 

Ahora, cuando hago clic en el botón de mi verificar si la cadena es válido el siguiente botón está activado

+0

Eso funcionó maravillosamente. En mi opinión, una solución mucho mejor que el enfoque de diálogo doble. Sin embargo, experimento unos segundos de retraso entre la finalización de la acción y el botón activado. Definitivamente no es un problema, solo una curiosidad. – bigfoot

+0

Ha pasado un tiempo desde que lo usé, pero de memoria fue bastante instantáneo para mí, ¿quizás algo relacionado con tu acción? –

6

Esta es una limitación bien conocida de Windows Installer. El estado del diálogo no cambia hasta que lo actualice de otra manera, por ejemplo, retrocediendo y retrocediendo, como mencionó correctamente.

La solución alternativa aquí es tener dos cuadros de diálogo idénticos, DialogA y DialogB. El botón PerformValidation en DialogA realizará la validación como lo hace ahora mismo y llamará a DialogB (como NewDialog). De la misma manera, el botón PerformValidation en DialogB también realizará la validación y llamará a DialogA. Por lo tanto, tendrá que cargar los cuadros de diálogo cada vez que ejecute la validación y el estado del botón se mostrará correctamente. El usuario no sospechará nada, porque solo verá el mismo diálogo. :-)

La idea se describe mejor en detalle here. Se llama "diálogos gemelos".

Espero que esto ayude.

+1

Gracias Yan, emplearé esta técnica. Es una lástima que el instalador de Windows sea tan limitado. :) – BBoy

+0

Afortunadamente, tenemos soluciones como esta ;-) –

+0

Es posible sin un diálogo doble, simplemente no entiendo muy bien cómo funciona estoy tratando de averiguarlo, vea http://msiext.codeplex.com y echa un vistazo a su CommonUiMsi.msi installer, tiene una pantalla de creación de DB con un botón de verificación que habilita después del éxito, la fuente está allí y no parecen estar usando un diálogo secundario, tengo la sensación de que tiene algo que ver con la forma en que publican sus propiedades, pero Aún tratando de averiguarlo. –

Cuestiones relacionadas