Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

  • Я создал диалог, включающий элемент управления PathEdit и элемент управления PushButton. Обратите внимание, что элемент управления PathEdit имеет свойство "Непрямое", установленное в "Да". Это означает, что все, что вы установили свойство to, - это просто указатель на что-то еще.

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

Что сработало для меня.

Ответ 2

Выбранный ответ на этот вопрос - слишком много работы. Вам не нужно все это делать.

Установите свой элемент управления PathEdit в каталог для настройки, как обычно. Затем в действиях кнопки обзора установите _BrowseProperty в NAME (не значение) вашего свойства для настройки, а затем 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>

Ответ 3

Чтобы иметь несколько каталогов (заполненных BrowseDlg) в том же диалоговом окне, требуется дополнительное косвенное указание. Также обратите внимание на нумерацию в пределах <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>

Затем передайте ссылки как прежде (нет необходимости определять дополнительные свойства):

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

Ответ 4

Установщик Windows не поддерживает просмотр файлов, поэтому в WiX нет прямой поддержки. Лучшим решением по-прежнему является пользовательское действие, выполняемое при нажатии кнопки обзора.

Здесь вы можете найти пример пользовательского действия: http://www.installsite.org/pages/en/msi/ca.htm

Ответ 5

У меня очень простое решение. Мы можем использовать атрибут ConfigurableDirectory для включения каталога поиска. Это хорошо работает для меня.

<Feature Id="OCMSnapshotConfigAppFeature" Title="OCM Snapshot Configuration" Level="1" ConfigurableDirectory="INSTALLDIR"> 

Ответ 6

Ни один из вышеперечисленных и нигде не работал у меня. Что работа была более простой и прямой.

Как и многие, мне нужно запросить у пользователя установщика целевые расположения файлов SQL Server.mdf и .ldf, которые, вероятно, будут находиться вне любой структуры каталогов предварительной установки. На самом деле мой предыдущий диалог запрашивает пользователя для целевого сервера базы данных. Учитывая это, я затем настраиваю действие над предыдущей диалоговой кнопкой "Далее", чтобы (а) находить пути mdf и ldf серверной "основной" базы данных, а затем (b) по умолчанию вводить новые базы данных в соответствующие пути к ведущим db.

Но часы разочарования, делающие 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>

Затем, чтобы использовать мой pop-up modal 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 файла.

K.I.S.S