使用WiX浏览器对话框设置编辑框值

时间:2011-12-13 22:16:06

标签: wix

我正在尝试创建一个WiX安装程序对话框,该对话框提供了一系列用户需要填写目录位置的文本框。

我想要做的是在每个对话框旁边放一个“浏览”按钮,当他们点击它时,将出现WiX浏览对话框,他们选择文件位置,单击“确定”,然后单击“浏览”按钮旁边的文本框将填写。

我知道如何使用自定义操作执行此操作,但我想知道是否有纯粹的WiX方式来执行此操作。

编辑:我应该更清楚。我的意思是目录位置,而不是文件位置。 Wix没有文件浏览支持,如下所示。

6 个答案:

答案 0 :(得分:22)

我最终找到了一种在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. 浏览对话框(我们最终会得到)希望在Directory表中设置一个对象,因此我们需要创建一个Directory对象,该对象仅用于保存我们浏览的值。由于我们不会在其中放置任何组件,因此文件系统上的任何内容都不会与我们选择的目录相关。我称之为TARGETBACKUPDIRECTORY。

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="TARGETBACKUPDIRECTORY">
            </Directory>
            ...
        </Directory>
    
  3. 现在我们需要创建一个指向Directory对象的属性。

    <Property Id="BACKUPDIRECTORY" Value="TARGETBACKUPDIRECTORY" />
    
  4. 我们现在需要确保在打开此对话框之前,_BrowserProperty属性已正确绑定到BACKUPDIRECTORY(因为它指向我们想要设置的Directory对象)。如果不这样做,则在尝试打开对话框时,在安装过程中会出现错误。在我的示例中,PrevDlg是一个出现在BackupConfigDlg之前的对话框。这里发生的是当按下Next按钮时,我将_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>
    
  5. 这对我有用。

答案 1 :(得分:12)

这个问题的选择答案太多了。你不需要做那些。

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>

答案 2 :(得分:4)

为了在同一个对话框窗口中有多个目录(由BrowseDlg填充),需要额外的间接寻址。另请注意&lt; Publish&gt;&lt; / Publish&gt;中的编号。标签:

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

答案 3 :(得分:3)

Windows Installer不支持文件浏览,因此在WiX中没有直接支持。最佳解决方案仍然是单击“浏览”按钮时执行的自定义操作。

您可以在此处找到示例自定义操作:http://www.installsite.org/pages/en/msi/ca.htm

答案 4 :(得分:1)

以上或其他任何地方都不适合我。工作是如此简单直接。

与许多人一样,我需要向安装程序用户提示SQL Server .mdf和.ldf文件的目标位置,这些文件可能位于任何预安装目录结构之外。实际上,我之前的Dialog会提示用户输入目标数据库服务器。鉴于此,然后我自定义对前面的Dialog的“下一步”按钮进行操作,以(a)找到mdf&amp; ldf服务器的“主”数据库的路径,然后(b)默认新数据库的相应路径到主数据库的路径。

但是让PathEdit与BrowseDlg玩得很好的几个小时的失败证明是徒劳的。我最终做的是创建一个名为PATH_TEMP_BROWSE的占位符属性。这是BrowseDlg中的“SetTarget”调用,它强制我们登记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文件执行相同的操作。

K.I.S.S

答案 5 :(得分:-1)

我有一个非常简单的解决方案。我们可以使用功能的ConfigurableDirectory属性来启用浏览目录。这对我来说很有用。

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