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))。