最近在开发InfoPath Form的时候遇到一个需求:需要一个HyperLink,用户点击它后,隐藏某些控件。这个小需求却不能很容易地解决,原因在于InfoPath的HyperLink控件并不支持添加Rule. 如果你研究过InfoPath的Source File,会发现其实在mainifest文件中,并没有把HyperLink当作控件,所以不可能为它设置Rule或触发事件。
 
为了解决这个需求,最容易想到的就是利用Button来代替HyperLink. 但是用户却要求界面上显示成HyperLink样式,那么我们就要将Button格式化成HyperLink样式。
 
首先,拖动一个Button控件到Form中,并右键选择Border and Shading...
 
 
然后,在设置框中去掉Border, 并把Shading的颜色设为None.
 
接下来,改变字体颜色并加上下划线:
 
目前为止,一切看上去都十分简单。但是问题很快就来了,当鼠标移动到Button上时,并没有变成"手"的样子。为了达到最佳效果,我决定通过修改xsl文件。至于为什么修改xsl文件能够改变Button的样式,已经超出了这篇文章的范畴。有兴趣的朋友可以去查一下InfoPath的原理,自然明了。
 
在菜单中选择File->Save As Source File...。选择一个文件夹保存源文件。
在记事本或xml编辑器中打开view1.xsl(或与包含Button的view同名的xsl文件),可以找到类似以下的代码:
<input style="BORDER-BOTTOM: #808080 6pt; BORDER-LEFT: #808080 6pt; BACKGROUND-COLOR: transparent; COLOR: #0000ff; BORDER-TOP: #808080 6pt; BORDER-RIGHT: #808080 6pt; TEXT-DECORATION: underline" class="langFont" title="" value="Button" type="button" xd:xctname="Button" xd:CtrlId="CTRL1_5" tabIndex="0"/>
 
在style属性中加入"cursor:hand; "
<input style="cursor:hand; BORDER-BOTTOM: #808080 6pt; BORDER-LEFT: #808080 6pt; BACKGROUND-COLOR: transparent; COLOR: #0000ff; BORDER-TOP: #808080 6pt; BORDER-RIGHT: #808080 6pt; TEXT-DECORATION: underline" class="langFont" title="" value="Button" type="button" xd:xctname="Button" xd:CtrlId="CTRL1_5" tabIndex="0"/>
 
保存后右键mainifest.xsf文件,选择Design. 此时InfoPath会自动读取所有Source File并显示成Form. 再选择File->Save As保存成xsn文件。
此时,再打开Form,当鼠标放到Button上时,会自动变成一个小手。这样,一个能够添加Rule并能触发事件的HyperLink就做出来了。
 
为了方便,还可以将这种Button做成一个Template Part,以后在设计InfoPath Form的时候就可以直接用了。 附件中是做好的Template Part.