2011-08-04 13 views
5

Estoy atrapado con el cuadro combinado y la acción personalizada en el instalador WIX.Acción personalizada de llamada en WIX en el cambio de valor en Combox

Tengo un cuadro combinado (desplegable) que contiene pocos valores. Quiero mostrar algo de texto en la pantalla (único para cada elemento en el menú desplegable) cuando el usuario selecciona un valor de este menú desplegable.

En .Net podemos hacer esto fácilmente ya que tenemos diferentes eventos predefinidos. Pero en WIX no veo ningún evento de este tipo.

¿Alguien ha enfrentado el mismo problema? O puede guiarme sobre cómo puedo hacerlo.

Respuesta

8

Windows Installer (la tecnología subyacente) no le permite hacerlo. Literalmente, no publica ningún evento cuando el valor del cuadro combinado (desplegable) cambia. Deberá agregar un botón, por ejemplo, para que el usuario haga clic cuando cambió el valor en el cuadro combinado ...

Alternativamente, puede cambiar a la técnica EmbeddedUI (WiX element y MSI table), pero es mucho más avanzado ...

ACTUALIZACIÓN: una muestra del uso del botón haga clic para actualizar el texto.

<UI> 
    ... 
    <ComboBox Property="WIX_VERSIONS"> 
    <ListItem Value="Windows Installer XML 3.0" /> 
    <ListItem Value="Windows Installer XML 3.5" /> 
    <ListItem Value="Windows Installer XML 3.6" /> 
    </ComboBox> 
    ... 
    <Dialog Id="MyCustomDlg"> 
    ... 
     <Control Id="ComboBoxMain" Type="ComboBox" X="10" Y="60" Width="300" Height="17" Property="WIX_VERSIONS" /> 
     <Control Id="ButtonMain" Type="PushButton" X="320" Y="60" Width="40" Height="17" Text="Show"> 
     <Publish Property="COMBOVALUEFORMATTED" Value="You've chosen the [WIX_VERSIONS] version of the toolset" /> 
     </Control> 
     <Control Id="LabelMain" Type="Text" X="10" Y="80" Width="360" Height="17" Property="COMBOVALUEFORMATTED" Text="[COMBOVALUEFORMATTED]" /> 
    ... 
    </Dialog> 
</UI> 

PushButton puede publicar más eventos, por ejemplo, DoAction, que se utiliza para ejecutar una acción personalizada en el botón de clic. Esto podría ser más relevante en tu caso.

+0

¿me puede dar un ejemplo de lo mismo? –

+0

He actualizado mi respuesta con la muestra –

+0

esto lo sé, pero usando alguna herramienta externa u otra cosa ¿no puedo lograr lo que exactamente quiero? –

0

Hay una forma de hacerlo en WiX. Solo necesita fabricar su propio evento modificado.

Comparamos nuestra condición DoAction a otra propiedad que se mantenga el estado anterior de la Combobox - VIRTUALWEBSITEOLD

ejecutar una acción personalizada en el cuadro combinado cuando el viejo no nueva iguales:

<Control Id="WebSite" Type="ComboBox" Width="180" Height="18" X="120" Y="48" ComboList="no" Property="VIRTUALWEBSITE"> 
     <Publish Event="DoAction" Value="LansaInitVirtualFolders"><![CDATA[VIRTUALWEBSITE <> VIRTUALWEBSITEOLD]]></Publish> 
    </Control> 

A continuación, el La acción personalizada realiza la misma comparación que DoAction (probablemente no sea necesaria) y luego guarda el valor de Combobox en la propiedad OLD.

Tstring wszWebsite = ReadProperty(_T("VIRTUALWEBSITE")); 
    Tstring wszWebsiteOld = ReadProperty(_T ("VIRTUALWEBSITEOLD")); 

    // If unchanged ignore request 
    if (wszWebsite == wszWebsiteOld) return true ; 

[Do Some stuff] 

    // Set the saved state of the combobox so we don't get called again until it changes 
    if (nResult == ERROR_SUCCESS || nResult == ERROR_NO_MORE_ITEMS) 
    { 
    WriteProperty(_T("VIRTUALWEBSITEOLD"), wszWebsite.c_str()); 
    } 

(Nota:. También es necesario utilizar Patrón gemelo de diálogo si la actualización, por ejemplo, un control de cuadro de lista Si su control, pero no se actualiza en Siguiente y Atrás pone al día, entonces patrón gemelo de diálogo se asegurará de que se actualiza)

Cuestiones relacionadas