2016-06-11 2 views
1

WiX. Я пишу плагин, который должен быть установлен только в одну из трех директорий. Поэтому я создаю диалог на заказ и вставить его в цепи:Почему свойство INSTALLFOLDER не было изменено через RadioButtonGroup?

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

Основная проблема заключается в том, что по мере того, как отображаются ваши диалоги, слишком поздно менять каталог, просто устанавливая свойство. Вместо этого вы должны как-то позвонить 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.

Смежные вопросы