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

chr*_*son 22 wix

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

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

我知道如何使用自定义操作来完成它,但我想知道是否有一种纯粹的WiX方式.

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

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

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="TARGETBACKUPDIRECTORY">
            </Directory>
            ...
        </Directory>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在我们需要创建一个指向Directory对象的属性.

    <Property Id="BACKUPDIRECTORY" Value="TARGETBACKUPDIRECTORY" />
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

这对我有用.


Nic*_*ley 13

选择这个问题的答案是太多的工作.你不需要做那么多.

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>
Run Code Online (Sandbox Code Playgroud)


小智 5

为了在同一个对话框窗口中拥有多个目录(由 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>
Run Code Online (Sandbox Code Playgroud)

然后像以前一样传递引用(不需要定义额外的属性):

<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>
Run Code Online (Sandbox Code Playgroud)