如何在UI Ref对话框开始之前插入自定义操作?

时间:2013-09-18 20:44:26

标签: visual-studio deployment wix wix3.7

具体来说,在我的WIX部署项目中,我正在尝试将TARGETDIR设置为[ProgramFilesFolder] [制造商],以便当我的自定义修改版本的WixUI_InstallDir打开InstallDirDlg时,它默认为该路径而不是驱动器根目录。

根据我在setting TARGETDIR找到关于inserting actions between dialogsdocumentation和各种数据的问题的答案,我一直在尝试各种形式的自定义操作:

<CustomAction Id="SetTARGETDIR" Property="TARGETDIR" Value="[ProgramFilesFolder][Manufacturer]" Execute="immediate" />

我也尝试过Property =“WIXUI_INSTALLDIR”,Execute =“firstSequence”,以及硬编码值。

我尝试使用InstallExecuteSequence:

调用它
<InstallExecuteSequence>
  <Custom Action="SetTARGETDIR" After="FindRelatedProducts"></Custom>
</InstallExecuteSequence>

当然,我试图在许多不同事件之前或之后插入。 (一个令人讨厌的障碍是我希望Before =“InstallDirDlg”是插入动作的最佳位置,但是当我尝试将任何对话框用作事件时,我收到编译错误。)

我还尝试在调用InstallDirDlg时在UI片段中发布操作:

<Publish Dialog="WelcomeDlg" Control="Next" Event="DoAction" Value="SetTARGETDIR">NOT Installed</Publish>

我尝试过的一些事情会引发错误,但大多数时候,问题只是TARGETDIR没有改变。默认安装路径仍然是驱动器根目录。我最好的猜测是,有一些关于使用这个WixUI的东西,从根本上改变了我应该期望自定义动作触发的方式。但我似乎无法找到任何线索,为什么会这样。

1 个答案:

答案 0 :(得分:1)

如果使用WixUI_InstallDir模板,则有一个特定的属性用于定义安装目录。此属性称为WIXUI_INSTALLDIR。请查看以下代码段,了解其工作原理:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder" Name="PFiles">
    <Directory Id="TESTFILEPRODUCTDIR" Name="Test File">
      ...
    </Directory>
   </Directory>
</Directory>
...
<Property Id="WIXUI_INSTALLDIR" Value="TESTFILEPRODUCTDIR" />
<UIRef Id="WixUI_InstallDir" />

此示例直接取自此处的文档:WixUI_InstallDir Dialog Set

如果我已正确理解您的示例,那么您将包含具有制造商名称的另一个子目录。 请注意它是not possible to use properties as directory names。您可以改用$(var.variables)!(loc.localizationVariables)我建议使用本地化变量。 E.g:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder" Name="PFiles">
    <Directory Id="ManufacturerDir" Name="!(loc.manufacturer)">
      <Directory Id="TESTFILEPRODUCTDIR" Name="Test File">
      ...
      </Directory>
    <Directory>
   </Directory>
</Directory>

另请注意:如果要在显示对话框之前执行自定义操作,则必须在InstallUISequence中安排自定义操作。请参阅Standard Actions Reference以了解他们的操作,然后查看安装程序日志。您将看到标准操作何时发生,然后您可以相应地安排自定义操作。

例如:

<InstallUISequence>
  <Custom Action="MyCA" Before="AppSearch" />
</InstallUISequence>

确保在第一个标准操作发生之前执行MyCA自定义操作。