PropertyRef要求ComboBox
在我的一个对话框中,我有以下控件:
<Control Id="EnvironmentComboBox" Type="ComboBox" Sorted="yes" ComboList="yes" Property="ENVIRONMENT" X="25" Y="110" Width="200" Height="15" /> 我在其他地方填写ComboBox如下: <UI> <ComboBox Property="ENVIRONMENT"> <ListItem Text="Development" Value="Development" /> <ListItem Text="SIT" Value="SIT" /> <ListItem Text="UAT" Value="UAT" /> <ListItem Text="Production" Value="Production" /> </ComboBox> </UI> 但是,如果我没有创建ComboBox位,MSI仍将构建,并且在安装期间它将失败(2205).因此,我想强制要求拥有一个名为ENVIRONMENT的属性.我试过在我的对话框中添加如下所示的PropertyRef: <PropertyRef Id="ENVIRONMENT" /> 但是,这似乎没有拿起< ComboBox Proeprty =“ENVIRONMENT”>.它将获取一个常规属性(< Property Id =“ENVIRONMENT”Value =“test”/>),但这并没有多大帮助. 有没有办法要求定义ComboBox? 编辑:为了澄清,我打算将ComboBox定义与Control定义分开,以便可以重用该对话框. 解决方法
MSI可以在没有为属性声明的Combobox项目的情况下存在,由元素引用(如果ComboList =’no’,您可以在组合框文本字段中键入所需的任何文本).
*该元素在MSI表*中没有任何相应的对象(只有它的子元素被写入MSI的ComboBox表).所以我认为这个元素从WIX点完全是可选的. 你的错误#2205是由’ComboBox’表根本不存在引起的.我想安装程序中只有一个组合框.从理论上讲,不可能在编译时将其检测为错误(也可以在自定义操作中创建表). WIX团队最能做的就是生成警告. 为了避免这个错误,我在可重用项目中声明了一个虚拟组合框元素: <Fragment><!--This fragment is intended to fill MSI tables with dummy items so that these tables became created. Tables without items aren't created--> <UI Id="Dummy"> <Dialog Id="DummyDlg" Width="370" Height="270" Title="Dummy" NoMinimize="yes"> <Control Id="DummyDlgComboBox" Type="ComboBox" Property="DummyComboboxProperty" Width="200" Height="17" X="100" Y="80"> <ComboBox Property="DummyComboboxProperty"> <ListItem Text="Dummy" Value="Dummy" /> </ComboBox> </Control> </Dialog> </UI> </Fragment> 并从我常用的UI序列中引用了这个UI. 现在,我不需要担心任何安装程序中组合框的存在. 至于你的问题的解决方法 – 如何强制用户不要忘记声明列表项,我会做一个tepmlate wix文件而不是wixlib.像这样的东西: <Control Id="EnvironmentComboBox" Type="ComboBox" Sorted="yes" ComboList="yes" Property="ENVIRONMENT" X="25" Y="110" Width="200" Height="15"> <ComboBox Property="ENVIRONMENT"> <Placeholder Id="EnvironmentComboBoxItems" /> </ComboBox> </Combobox> 并为用户提供使用您提供的模板转换工具重用此代码的唯一功能.它将验证是否为所有模板占位符提供了内容. 转换可能如下所示: <TemplateSubstitutions> <PlaceholderContent PlaceholderId='EnvironmentComboBoxItems'> <ListItem Text="Development" Value="Development" /> <ListItem Text="SIT" Value="SIT" /> <ListItem Text="UAT" Value="UAT" /> <ListItem Text="Production" Value="Production" /> </PlaceholderContent> </TemplateSubstitutions> 合并它们的工具: static void Main(string[] args) { var templatePath = args[0]; var templateTransformPath = args[1]; var resultPath = args[2]; var templateDoc = XDocument.Load(templatePath); var transformationDoc = XDocument.Parse(templateTransformPath); Dictionary<string,XElement> contents = transformationDoc.Element("TemplateSubstitutions").Elements("PlaceholderContent").ToDictionary(e => e.Attribute("PlaceholderId").Value,e => e); var planceHolders = templateDoc.Descendants("Placeholder").ToArray(); foreach (var ph in planceHolders) { ph.ReplaceWith(new XElement(contents[ph.Attribute("Id").Value]).Nodes()); } templateDoc.Save(resultPath); } 当然,此工具尚未发布 – 您可能希望向客户端添加一些有意义的错误消息并验证提供的转换.但为了避免代码复杂化,我没有实现. 我在目前很少的安装程序项目中使用这种方法.所有模板都存储在公共位置,客户端安装程序可以获取所需的任何文件并对其进行转换. 我的发布工具当然有点先进.它可以使用通配符替换属性中的值 – 我认为在重用组件时它非常有用.我用这样的模板: <Component Guid="{StrToGuid({ProductName}_7A51C3FD-CBE9-4EB1-8739-A8F45D46DCF5)}"> 并且用户应该在我的模板转换工具的命令行中提供所有模板属性(例如“ProductName”).它确保组件在不同产品之间具有唯一的GUID,因此当它们安装在同一台机器上时不会发生冲突. 注意:但要注意图括号 – 它们对WIX和MSI具有特殊含义:http://msdn.microsoft.com/library/aa368609.aspx.但对于我来说它不够清楚,我不经常使用它们.但是您可能需要另一个通配符前缀. 至于组织安装程序构建过程,您可以在项目的预构建时添加模板转换调用.但我决定使用单独的构建脚本而不是本机Visual Studio构建.它看起来更简单灵活.而且我没有得到像“命令’xxx’退出代码yyy”这样的令人讨厌的错误 – 我总是看到模板转换日志,错误消息等. 希望我对车轮的改造将有助于任何人=). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows – 获取在Bat文件中运行的exe的进程ID
- winapi – 什么是WIN32 API WM_REFLECT消息?
- windows-phone-8 – 如何获得Windows Phone 8设备
- Microsoft是否有关于在不同Windows平台上存储App
- 什么是在Windows上运行的最佳维基?
- Windows环境安装Elasticsearch
- windows-server-2008 – 是否有替代WSUS for Win
- Windows应用程序实时监控远程服务器的Linux服务器
- Windows Server 2012 R2 IIS 10 / HTTP / 2
- 使用dll和java jni4net时出现UnsatisfiedLinkErr