que - Use el diálogo del navegador de WiX para establecer el valor del cuadro de edición
wix ayuda (6)
Estoy tratando de crear un cuadro de diálogo de instalación de WiX que proporcione una serie de cuadros de texto que los usuarios deben completar con las ubicaciones de los directorios.
Lo que me gustaría hacer es poner un botón Examinar al lado de cada cuadro de diálogo y cuando haga clic en él, aparecerá el cuadro de diálogo Examinar de WiX, seleccionarán la ubicación del archivo, hacer clic en Aceptar y se rellenará el cuadro de texto junto al botón de búsqueda. en.
Sé cómo hacerlo con una acción personalizada, pero me preguntaba si había una forma pura de hacer esto con WiX.
EDITAR: Debería ser más claro. Me refería a ubicaciones de directorio, no a ubicaciones de archivos. Wix no tiene soporte de navegación de archivos como un usuario se indica a continuación.
Ninguno de los anteriores o cualquier otro lugar funcionó para mí. Lo que funcionó es mucho más simple y directo.
Como muchos, debo solicitar al usuario del Instalador las ubicaciones de destino de los archivos .mdf y .ldf de SQL Server, que probablemente se encuentren fuera de cualquier estructura de Directorio previa a la instalación. De hecho, mi cuadro de diálogo anterior solicita al usuario el servidor de base de datos de destino. Dado eso, luego actúo de forma personalizada en el botón "Siguiente" de ese Diálogo anterior para (a) encontrar las rutas mdf y ldf de la base de datos "maestra" del servidor y luego (b) predeterminar las rutas respectivas de la nueva base de datos a las de la db maestra.
Pero las horas de frustración que hicieron que PathEdit fuera agradable con BrowseDlg resultaron inútiles. Lo que terminé haciendo fue crear una propiedad de marcador de posición llamada PATH_TEMP_BROWSE. Es la llamada "SetTarget" en el BrowseDlg que nos obliga a enlistar el árbol de directorios de Wix. Deshágase de esa línea en su propia copia personalizada de BrowseDlg y, en cambio, pase el directorio seleccionado del usuario a través de PATH_TEMP_BROWSE de esta manera:
<Dialog Id="DirectoryBrowserDlg" Width="370" Height="270" Title="Dir Browse">
<Control Id="Path" Type="PathEdit" X="25" Y="202" Width="320" Height="18" Property="PATH_TEMP_BROWSE" Indirect="yes" />
<Control Id="OK" Type="PushButton" X="240" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUIOK)">
<!-- NO! -->
<!--<Publish Event="SetTargetPath" Value="[_BrowseProperty]">1</Publish>-->
<Publish Event="EndDialog" Value="Return">1</Publish>
</Control>
...
<Control Id="DirectoryCombo" Type="DirectoryCombo" X="70" Y="55" Width="220" Height="80" Property="PATH_TEMP_BROWSE" Indirect="yes" Fixed="yes" Remote="yes">
<Subscribe Event="IgnoreChange" Attribute="IgnoreChange" />
</Control>
...
<Control Id="DirectoryList" Type="DirectoryList" X="25" Y="83" Width="320" Height="98" Property="PATH_TEMP_BROWSE" Sunken="yes" Indirect="yes" TabSkip="no" />
...
</Dialog>
Luego, para hacer uso de mi menú emergente modal DirectoryBrowserDlg dentro de mi cuadro de diálogo de instalación que solicita al usuario el nuevo nombre de la base de datos, así como sus archivos lógicos ...
<Control Id="MdfPath"
Type="PathEdit"
X="37"
Y="184"
Width="313"
Height="18"
Property="PATH_DBMDFCS"
/>
<Control Id="MdfBrowse"
Type="PushButton"
X="350"
Y="184"
Width="22"
Height="17"
Text="Browse..."
>
<Publish Property="PATH_TEMP_BROWSE" Value="PATH_DBMDFCS" Order="1">1</Publish>
<Publish Event="SpawnDialog" Value="DirectoryBrowserDlg" Order="2">1</Publish>
<Publish Property="PATH_DBMDFCS" Value="PATH_TEMP_BROWSE" Order="3" />
</Control>
Haga lo mismo para su archivo .ldf.
BESO
Para tener varios directorios (rellenados por el BrowseDlg) en la misma ventana de diálogo, se requiere una dirección adicional. Observe también la numeración dentro de las etiquetas <Publish> </Publish>:
<Control Id="WorkingDirFolderLabel" Type="Text" Width="220" Height="12" X="10" Y="50" Text="Working directory:"/>
<Control Id="WorkingDirFolder" Type="PathEdit" Width="250" Height="17" X="10" Y="62" Property="_WorkingDirBrowseProperty" Indirect="yes"/>
<Control Id="WorkingDirBrowse" Type="PushButton" Width="56" Height="17" X="265" Y="62" Text="Browse..." >
<Publish Property="_BrowseProperty" Value="[_WorkingDirBrowseProperty]" Order="2">1</Publish>
<Publish Event="SpawnDialog" Value="BrowseDlg" Order="3">1</Publish>
</Control>
<Control Id="DocsDirFolderLabel" Type="Text" Width="220" Height="12" X="10" Y="100" Text="Documentation area:"/>
<Control Id="DocsDirFolder" Type="PathEdit" Width="250" Height="17" X="10" Y="112" Property="_DocsDirBrowseProperty" Indirect="yes" />
<Control Id="DocsDirBrowse" Type="PushButton" Width="56" Height="17" X="265" Y="112" Text="Browse..." >
<Publish Property="_BrowseProperty" Value="[_DocsDirBrowseProperty]" Order="2">2</Publish>
<Publish Event="SpawnDialog" Value="BrowseDlg" Order="3">2</Publish>
</Control>
Luego pase las referencias como antes (no es necesario definir propiedades adicionales):
<Publish Dialog="PrevDlg" Control="Next" Property="_WorkingDirBrowseProperty" Value="TARGETWORKINGDIRECTORY" Order="1">1</Publish>
<Publish Dialog="PrevDlg" Control="Next" Property="_DocsDirBrowseProperty" Value="TARGETDOCSDIRECTORY" Order="1">1</Publish>
<Publish Dialog="PrevDlg" Control="Next" Event="NewDialog" Value="BackupConfigDlg" Order="2">1</Publish>
Tengo una solución muy fácil. Podemos usar el atributo ConfigurableDirectory de la característica para habilitar el directorio de navegación. Funciona bien para mi
<Feature Id="OCMSnapshotConfigAppFeature" Title="OCM Snapshot Configuration" Level="1" ConfigurableDirectory="INSTALLDIR">
Terminé encontrando la manera de hacerlo completamente en Wix. Wix viene con un diálogo de navegación llamado BrowseDlg. Esto es lo que hice:
Creé un diálogo que incluye un control PathEdit y un control PushButton. Observe que el control PathEdit tiene la propiedad Indirecta establecida en sí. Esto significa que cualquier cosa que establezca en Propiedad es solo un puntero a otra cosa.
<Dialog Id="BackupConfigDlg" Width="370" Height="270" Title="Backup Configuration"> <Control Type="Text" Id="lblInstructions" Width="348" Height="13" X="10" Y="10"> <Text>{/WixUI_Font_Title}Please select the directory you want to backup.</Text> </Control> <Control Type="Text" Id="lblBackupDirectory" Width="69" Height="9" X="10" Y="40" Text="Backup directory:"> </Control> <Control Type="PathEdit" Id="Folder" Width="219" Height="15" X="82" Y="38" Property="_BrowseProperty" Indirect="yes" /> <Control Type="PushButton" Id="Browse" Width="56" Height="17" X="304" Y="37" Text="Browse..." /> <Control Type="Line" Id="line" Width="362" Height="2" X="4" Y="229" /> <Control Id="Cancel" Type="PushButton" X="239" Y="240" Width="56" Height="17" Cancel="yes" Text="Cancel"> <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish> </Control> <Control Type="PushButton" Id="Install" Width="56" Height="17" X="300" Y="240" Text="Install"> <Publish Event="EndDialog" Value="Return" /> </Control> </Dialog>
El cuadro de diálogo de exploración (que finalmente obtendremos) espera establecer un objeto en la tabla de Directorio, por lo que necesitamos crear un objeto de Directorio que solo se usará para mantener el valor que buscamos. Dado que no pondremos ningún componente en él, nada en el sistema de archivos cambiará en relación con el directorio que elegimos. Yo llamo al mío TARGETBACKUPDIRECTORY.
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="TARGETBACKUPDIRECTORY"> </Directory> ... </Directory>
Ahora necesitamos crear una propiedad que apunte al objeto Directorio.
<Property Id="BACKUPDIRECTORY" Value="TARGETBACKUPDIRECTORY" />
Ahora debemos asegurarnos de que la propiedad _BrowserProperty esté correctamente vinculada a BACKUPDIRECTORY (porque apunta al objeto de Directorio que queremos establecer) antes de que se abra este cuadro de diálogo. Si no lo hace, recibirá un error durante el proceso de instalación cuando intente abrir el cuadro de diálogo. En mi ejemplo, PrevDlg es un cuadro de diálogo que aparece antes de BackupConfigDlg. Lo que sucede aquí es que cuando se presiona el botón Siguiente, establezco la propiedad _BrowserProperty en BACKUPDIRECTORY, luego abro el cuadro de diálogo. Debe tener lugar en ese orden, así que uso la propiedad Orden para hacerla cumplir. Hago lo mismo cuando se presiona el botón de navegación, no estoy seguro de que deba hacerlo, pero lo hago solo por medidas seguras.
<Publish Dialog="PrevDlg" Control="Next" Property="_BrowseProperty" Value="[BACKUPDIRECTORY]" Order="1">1</Publish> <Publish Dialog="PrevDlg" Control="Next" Event="NewDialog" Value="BackupConfigDlg" Order="2">1</Publish> <Publish Dialog="BackupConfigDlg" Control="Browse" Property="_BrowseProperty" Value="[BACKUPDIRECTORY]" Order="1"> </Publish> <Publish Dialog="BackupConfigDlg" Control="Browse" Event="SpawnDialog" Value="BrowseDlg" Order="2"> </Publish>
Eso es lo que funcionó para mí.
Windows Installer no admite la búsqueda de archivos, por lo que no hay soporte directo para esto en WiX. La mejor solución sigue siendo una acción personalizada ejecutada al hacer clic en el botón Examinar.
Puede encontrar una muestra de acción personalizada aquí: http://www.installsite.org/pages/en/msi/ca.htm
La respuesta seleccionada a esta pregunta es demasiado trabajo. No necesitas hacer todo eso.
Establezca su control PathEdit
en el directorio para configurarlo como lo haría normalmente. Luego, en las acciones del botón de _BrowseProperty
, establezca _BrowseProperty
en el NOMBRE (no valor de) de su propiedad para configurar y luego SpawnDialog
. Eso es.
<Control Type="PathEdit" Id="TxtDir" Width="155" Height="15" X="105" Y="57" Property="OUTPUTDIRECTORY"/>
<Control Id="btnDirBrowse" Type="PushButton" Width="56" Height="17" X="260" Y="57" Text="Browse..." >
<Publish Property="_BrowseProperty" Value="OUTPUTDIRECTORY" Order="1">1</Publish>
<Publish Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
</Control>