我正在尝试创建一个WiX安装程序对话框,该对话框提供了一系列用户需要填写目录位置的文本框。
我想要做的是在每个对话框旁边放一个“浏览”按钮,当他们点击它时,将出现WiX浏览对话框,他们选择文件位置,单击“确定”,然后单击“浏览”按钮旁边的文本框将填写。
我知道如何使用自定义操作执行此操作,但我想知道是否有纯粹的WiX方式来执行此操作。
编辑:我应该更清楚。我的意思是目录位置,而不是文件位置。 Wix没有文件浏览支持,如下所示。答案 0 :(得分:22)
我最终找到了一种在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>
浏览对话框(我们最终会得到)希望在Directory表中设置一个对象,因此我们需要创建一个Directory对象,该对象仅用于保存我们浏览的值。由于我们不会在其中放置任何组件,因此文件系统上的任何内容都不会与我们选择的目录相关。我称之为TARGETBACKUPDIRECTORY。
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="TARGETBACKUPDIRECTORY">
</Directory>
...
</Directory>
现在我们需要创建一个指向Directory对象的属性。
<Property Id="BACKUPDIRECTORY" Value="TARGETBACKUPDIRECTORY" />
我们现在需要确保在打开此对话框之前,_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>
这对我有用。
答案 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">