为什么没有通过RadioButtonGroup更改INSTALLFOLDER属性?

时间:2016-06-11 11:29:07

标签: wix

维克斯。我写的插件必须只安装到三个目录之一。因此,我创建自定义对话框并将其插入链中:

enter image description here

这是我对话框的代码:

<?xml version='1.0' encoding='Windows-1252'?>
<!--  SelectInstallDirectory.wxs
      © Andrey Bushman, 2016 
      Dialog window for the install directory selection of AutoCAD extension. -->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>

    <UI>
      <!--<Property Id="DefaultUIFont">DlgFont10</Property>-->
      <TextStyle Id="DlgFont10" FaceName="Tahoma" Size="10" />
      <TextStyle Id="DlgFont20" FaceName="Tahoma" Size="20" />
      <TextStyle Id="DlgFont10_important" FaceName="Tahoma" Size="10" Red="255" Green="0" Blue="0"/>
      <TextStyle Id="DlgTitleFont" FaceName="Tahoma" Size="10" Bold="yes" />

      <!-- I am forced to define the INSTALLFOLDER again because SelectInstallDirectory dialog 
      doesnt see this property. -->
      <Property Id="INSTALLFOLDER" Value="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"/>

      <!--This dialog selects the install directory through the RadioButton items.-->
      <Dialog Id="SelectInstallDirectory" Title="AutoCAD extension location"
              NoMinimize="yes" Width="400" Height="270">

        <Control Id="TitleImage" Type="Bitmap" X="0" Y="0" Width="400" Height="65" Text="TitleImageFile">
          <Binary Id="TitleImageFile" SourceFile="SelectInstallDirectory_banner.jpg"/>
        </Control>

        <Control Id="TitleText" Type="Text" X="60" Y="20" Width="400" Height="35"
                 Transparent="yes" NoPrefix="yes">
          <Text>{\DlgFont20}Proxy Tools for AutoCAD</Text>
        </Control>

        <Control Id="Title" Type="Text" X="5" Y="85" Width="300" Height="15"
                 Transparent="yes" NoPrefix="yes">
          <Text>Select the target directory for the AutoCAD extension installing:</Text>
        </Control>

        <Control Id="rbgrPath" Type ="RadioButtonGroup"
                 X="5" Y="100" Width="500" Height="100" Property="INSTALLFOLDER">
          <RadioButtonGroup Property="INSTALLFOLDER">
            <RadioButton
              Text="[ProgramFilesFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
              Value="[ProgramFilesFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
              Height="13" Width="500" X="5" Y="5"/>
            <RadioButton
              Text="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
              Value="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
              Height="13" Width="500" X="5" Y="20"/>
            <RadioButton
              Text="$(env.AppData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
              Value="$(env.AppData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
              Height="13" Width="500" X="5" Y="35"/>
          </RadioButtonGroup>
        </Control>

        <Control Id="warning_acad2012" Type="Text" X="5" Y="175" Width="100" Height="30"
                Transparent="yes" NoPrefix="yes">
          <Text>{\DlgTitleFont}WARNING</Text>
        </Control>

        <Control Id="warning_acad2012_text" Type="Text" X="10" Y="190" Width="380" Height="40"
                 Transparent="yes" NoPrefix="yes">
          <Text>{\DlgFont10_important}Don't select the "$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\" variant if you will use AutoCAD 2012, because its bundle-autoloader don't monitor of that directory.</Text>
        </Control>

        <Control Id="Back" Type="PushButton" X="205" Y="243" Width="70" 
                 Height="17" Default="no" Text="&lt;&lt; Previous">
          <Publish Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
        </Control>

        <Control Id="Install" Type="PushButton" X="280" Y="243" Width="56" 
                 Height="17" Default="yes" Text="Install">
          <Publish Event="NewDialog" Value="SetupTypeDlg">INSTALLFOLDER</Publish>
        </Control>

        <Control Id="Cancel" Type="PushButton" X="340" Y="243" Width="56" Height="17"
                 Default="no" Text="Cancel">
          <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
        </Control>
      </Dialog>
    </UI>
  </Fragment>
</Wix>

请注意我在SelectInstallDirectory.wxs文件中再次定义 INSTALLFOLDER目录,因为我的对话框在找不到INSTALLFOLDER属性时在其他文件中定义(见下文)。这是正确的吗?

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="$(var.ADSK_LOCATION)">
    <Directory Id="Adsk" Name="Autodesk">
      <Directory Id="Adsk_Plugins" Name="ApplicationPlugins">
        <Directory Id="INSTALLFOLDER" Name="$(var.EXTENSION_FOLDER_NAME)">
          <Directory Id="LICENSE" Name="license"/>
          <Directory Id="RESOURCES" Name="resources"/>
          <Directory Id="HELP" Name="help"/>
          <Directory Id="MENU" Name="menu">
            <Directory Id="CUI" Name="cui"/>
            <Directory Id="CUIX" Name="cuix"/>
          </Directory>
          <Directory Id="BIN" Name="bin">
            <Directory Id="BIN_RU" Name="ru"/>
          </Directory>
        </Directory>
      </Directory>
    </Directory>
  </Directory>

Product元素中我添加了这个:

<UI Id="MyWixUI_Mondo">
  <UIRef Id="WixUI_Mondo" />
  <UIRef Id="WixUI_ErrorProgressText" />

  <!-- My dialog for the INSTALLFOLDER value getting. -->
  <DialogRef Id="SelectInstallDirectory" />

  <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="SelectInstallDirectory" Order="3">LicenseAccepted = "1"</Publish>
  <Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="SelectInstallDirectory">1</Publish>
</UI>

现在我的自定义对话框存在于链中。但是如果我在对话框窗口中选择目标目录的其他变体,那么INSTALLFOLDER的值实际上不会改变。我的根Feature元素使用其ConfigurableDirectory属性的变量值(我仅将此属性用于此插件的调试):

<Feature Id="$(var.SolutionName)" Title="$(var.ProductName)" Description="The complete package." Display='expand'
             Level="1" ConfigurableDirectory="INSTALLFOLDER" AllowAdvertise='no' InstallDefault='local' Absent='disallow'
           TypicalDefault='install'>

enter image description here

我该如何解决?

1 个答案:

答案 0 :(得分:1)

核心问题是,在显示对话框时,仅通过设置属性来更改目录为时已晚。相反,你必须以某种方式呼叫MsiSetTargetPath。通常,从对话框中执行此操作的最佳方法是使用SetTargetPath Control Event。在您的项目中,这可能如下所示:

: : :
<Control Id="Install" Type="PushButton" X="280" Y="243" Width="56" 
             Height="17" Default="yes" Text="Install">
    <Publish Event="SetTargetPath" Value="INSTALLFOLDER">1</Publish>
    <Publish Event="NewDialog" Value="SetupTypeDlg">INSTALLFOLDER</Publish>
</Control>
: : :

为什么设置属性有时会起作用?因为Costing通常会根据初始属性执行大量目录计算,并在内部执行大量设置目标路径。因此,在CostFinalize操作之前,您可以(并且必须)只设置属性。在CostFinalize之后,您必须更直接地调用MsiSetTargetPath。