Используйте диалог браузера WiX для установки значения поля редактирования
Я пытаюсь создать диалоговое окно установщика WiX, в котором есть ряд текстовых полей, которые пользователи должны заполнять каталогами.
То, что я хотел бы сделать, это поместить кнопку "Обзор" рядом с каждым диалоговым окном, и когда они щелкают по нему, открывается диалоговое окно "Обзор WiX", они выбирают местоположение файла, нажимают "ОК", и текстовое поле рядом с кнопкой обзора будет заполнено. в.
Я знаю, как сделать это с помощью пользовательского действия, но мне было интересно, есть ли чистый способ WiX сделать это.
РЕДАКТИРОВАТЬ: Я должен быть более ясным. Я имел в виду расположение каталогов, а не расположение файлов. Wix не имеет поддержки просмотра файлов, как указано одним пользователем ниже.
6 ответов
Я нашел способ сделать это полностью в Wix. Wix поставляется с диалоговым окном BrowseDlg. Вот что я сделал:
Я создал диалог, включающий элемент управления PathEdit и элемент управления PushButton. Обратите внимание, что элемент управления PathEdit имеет свойство Indirect, установленное в yes. Это означает, что все, что вы устанавливаете для свойства, является просто указателем на что-то другое.
<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>
В диалоговом окне обзора (к которому мы в конечном итоге доберемся) предполагается установить объект в таблице Справочника, поэтому нам нужно создать объект Справочника, который будет использоваться только для хранения значения, к которому мы обращаемся. Поскольку мы не будем помещать в него какие-либо компоненты, ничто в файловой системе не изменится в зависимости от выбранного нами каталога. Я называю мой TARGETBACKUPDIRECTORY.
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="TARGETBACKUPDIRECTORY"> </Directory> ... </Directory>
Теперь нам нужно создать свойство, которое указывает на объект Directory.
<Property Id="BACKUPDIRECTORY" Value="TARGETBACKUPDIRECTORY" />
Теперь нам нужно убедиться, что свойство _BrowserProperty правильно связано с BACKUPDIRECTORY (потому что оно указывает на объект Directory, который мы хотим установить), прежде чем откроется это диалоговое окно. Если вы этого не сделаете, вы получите сообщение об ошибке в процессе установки при попытке открыть диалоговое окно. В моем примере PrevDlg - это диалоговое окно, которое появляется перед BackupConfigDlg. Здесь происходит следующее: когда нажимается кнопка "Далее", я устанавливаю для свойства _BrowserProperty значение BACKUPDIRECTORY, а затем открываю диалоговое окно. Это должно происходить в таком порядке, поэтому я использую свойство Order для его принудительного применения. Я делаю то же самое, когда нажимают кнопку обзора, но не уверен, что мне нужно это делать, но я делаю это просто для безопасности.
<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>
Вот что сработало для меня.
Выбранный ответ на этот вопрос - слишком много работы. Вам не нужно делать все это.
Установите свой PathEdit
управление каталогом для настройки, как обычно. Затем в действиях кнопки обзора установите _BrowseProperty
на имя (не значение) вашей собственности для настройки, а затем SpawnDialog
, Вот и все.
<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>
Чтобы иметь несколько каталогов (заполненных BrowseDlg) в одном диалоговом окне, требуется дополнительное косвенное обращение. Обратите внимание также на нумерацию в тегах
<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>
Затем передайте ссылки, как и раньше (не нужно определять дополнительные свойства):
<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>
Установщик Windows не поддерживает просмотр файлов, поэтому прямой поддержки этого в WiX нет. Лучшим решением по-прежнему является пользовательское действие, выполняемое при нажатии кнопки обзора.
Вы можете найти образец пользовательского действия здесь: http://www.installsite.org/pages/en/msi/ca.htm
Ничто из вышеперечисленного или где-либо еще не работало для меня. То, что сработало, так проще и понятнее.
Как и многим, мне нужно запросить у пользователя установщика целевые расположения файлов.mdf и.ldf для SQL Server, которые, вероятно, будут находиться вне предустановочной структуры каталогов. Фактически, мой предыдущий диалог запрашивает у пользователя целевой сервер базы данных. Учитывая это, я затем настраиваю пользовательскую кнопку "Далее" предыдущего диалогового окна, чтобы (а) найти пути mdf и ldf "основной" базы данных сервера, а затем (b) установить по умолчанию пути новой базы данных к пути основной базы данных.
Но часы разочарования, заставляющие PathEdit играть хорошо с BrowseDlg, оказались бесполезными. Я закончил тем, что создал свойство-заглушку PATH_TEMP_BROWSE. Именно вызов SetTarget в BrowseDlg заставляет нас подключиться к дереву каталогов Wix. Избавьтесь от этой строки в своем собственном плагиате BrowseDlg и вместо этого передайте выбранный пользователем каталог через PATH_TEMP_BROWSE таким образом:
<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>
Затем, чтобы использовать мой всплывающий модальный DirectoryBrowserDlg в моем инсталляционном диалоге, который запрашивает у пользователя имя новой базы данных, а также ее логические файлы...
<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>
Сделайте то же самое для вашего файла.ldf.
ПОЦЕЛУЙ
У меня очень простое решение. Мы можем использовать атрибут ConfigurableDirectory, чтобы включить просмотр каталога. Это хорошо работает для меня.
<Feature Id="OCMSnapshotConfigAppFeature" Title="OCM Snapshot Configuration" Level="1" ConfigurableDirectory="INSTALLDIR">