Используйте диалог браузера WiX для установки значения поля редактирования

Я пытаюсь создать диалоговое окно установщика WiX, в котором есть ряд текстовых полей, которые пользователи должны заполнять каталогами.

То, что я хотел бы сделать, это поместить кнопку "Обзор" рядом с каждым диалоговым окном, и когда они щелкают по нему, открывается диалоговое окно "Обзор WiX", они выбирают местоположение файла, нажимают "ОК", и текстовое поле рядом с кнопкой обзора будет заполнено. в.

Я знаю, как сделать это с помощью пользовательского действия, но мне было интересно, есть ли чистый способ WiX сделать это.

РЕДАКТИРОВАТЬ: Я должен быть более ясным. Я имел в виду расположение каталогов, а не расположение файлов. Wix не имеет поддержки просмотра файлов, как указано одним пользователем ниже.

6 ответов

Решение

Я нашел способ сделать это полностью в Wix. Wix поставляется с диалоговым окном BrowseDlg. Вот что я сделал:

  1. Я создал диалог, включающий элемент управления 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>
    
  2. В диалоговом окне обзора (к которому мы в конечном итоге доберемся) предполагается установить объект в таблице Справочника, поэтому нам нужно создать объект Справочника, который будет использоваться только для хранения значения, к которому мы обращаемся. Поскольку мы не будем помещать в него какие-либо компоненты, ничто в файловой системе не изменится в зависимости от выбранного нами каталога. Я называю мой TARGETBACKUPDIRECTORY.

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="TARGETBACKUPDIRECTORY">
            </Directory>
            ...
        </Directory>
    
  3. Теперь нам нужно создать свойство, которое указывает на объект Directory.

    <Property Id="BACKUPDIRECTORY" Value="TARGETBACKUPDIRECTORY" />
    
  4. Теперь нам нужно убедиться, что свойство _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"> 

Другие вопросы по тегам