高级RememberProperty模式

时间:2012-12-03 16:14:15

标签: design-patterns properties wix

Rob Mensching有一篇文章"Remember Property pattern",它允许保护命令行中指定的值不被RegSearches覆盖。一切正常,直到我们需要一些高级逻辑(例如默认值)。

我通过自定义操作设置默认值一点扩展了该模式(仍然可以正常工作):

<Fragment>
  <Property Id="MY_PROPERTY">
    <RegistrySearch Id="MyProperty_RegSearch" Root="HKLM" Key="SOFTWARE\MyCompanyName\MyApplicationName" Name="MyProperty" Type="raw"></RegistrySearch>
  </Property>

  <DirectoryRef Id="INSTALLDIR">
    <Component Id="PermanentRegistryValues" Guid="MY_GUID" Permanent="yes">
      <RegistryKey Root="HKLM" Key="SOFTWARE\MyCompanyName\MyApplicationName" Action="create">
        <RegistryValue Name="MyProperty" Type="string" Value="[MY_PROPERTY]" />
      </RegistryKey>
    </Component>
  </DirectoryRef>

  <CustomAction Id="SaveCmd_MyProperty" Property="cmd_MyProperty" Value="[MY_PROPERTY]" Execute="firstSequence" />
  <CustomAction Id="RestoreCmd_MyProperty" Property="MY_PROPERTY" Value="[cmd_MyProperty]" Execute="firstSequence" />
  <CustomAction Id="SetDefault_MyProperty" Property="MY_PROPERTY" Value="MyPropertyDefaultValue" Execute="firstSequence" />

  <InstallUISequence>
    <Custom Action="SaveCmd_MyProperty" Before="AppSearch" />
    <Custom Action="RestoreCmd_MyProperty" After="AppSearch">cmd_MyProperty</Custom>
    <Custom Action="SetDefault_MyProperty" Before="ValidateProductID">NOT MY_PROPERTY</Custom>
  </InstallUISequence>

  <InstallExecuteSequence>
    <Custom Action="SaveCmd_MyProperty" Before="AppSearch" />
    <Custom Action="RestoreCmd_MyProperty" After="AppSearch">cmd_MyProperty</Custom>
    <Custom Action="SetDefault_MyProperty" Before="ValidateProductID">NOT MY_PROPERTY</Custom>
  </InstallExecuteSequence>
</Fragment>

但这是一个问题:

如果我需要在RadioButtonGroup中使用MyProperty,例如,WIX(我认为它实际上是MSI限制)不允许声明此属性没有设置值,如上例所示。设置一些虚拟值也是不可能的 - WIX给出了另一个编译错误:

error LGHT0204: ICE34: dummy is not a valid default value for the RadioButtonGroup using property MyProperty. The value must be listed as an option in the RadioButtonGroup table.

我还尝试在RadiobuttonGroup中添加'dummy'选项,并将该选项放在坐标(1000; 1000)中,这些坐标远远超出了RadioButtonGroup控件的边界。但缺点是使用键盘用户可以选择该选项。此外,这绝对是一种不好的做法。

所以我的问题: 是否有可能以及如何实现记住属性模式,以防我需要一组固定允许值的默认值?

以下是我正在讨论的代码的剩余部分(希望对您有所帮助):

<Property Id="MY_PROPERTY" Value="Value1">
  <RegistrySearch Id="MyProperty_RegSearch" Root="HKLM" Key="SOFTWARE\MyCompanyName\MyApplicationName" Name="MyProperty" Type="raw"></RegistrySearch>
</Property>

<Control Type="RadioButtonGroup" Property="MY_PROPERTY" Id="MyRbtn" Width="100" Height="159" X="34" Y="90">
  <RadioButtonGroup Property="MY_PROPERTY">
    <RadioButton Text="Value1" Value="Users" Width="100" Height="17" X="0" Y="0" />
    <RadioButton Text="Value2" Value="Roles" Width="100" Height="17" X="0" Y="45" />
  </RadioButtonGroup>
</Control>

PS:我在Restore和SetDefault自定义操作上尝试了多种条件组合,但它们都不适用于所有必需的情况:在UI模式/静默模式下安装,升级,更改/修复。< / p>

我没有看到任何简单的方法来克服这个问题。唯一的可能性是涉及一个辅助属性并将自定义操作的数量加倍(对于单个属性已经很多(3))。

0 个答案:

没有答案
相关问题