VisualBrush是一种比较特殊的笔刷,它的功能仍然是用来给元素填充图案,但它的内容却可以是各种控件。
你可以将其理解为一个普通的容器,但在其内部的所有控件都会失去交互能力,而只保留显示能力。
你可以通过本例学习到关于VisualBrush的使用方法,以及复杂样式的定制技巧。
首先来看一下我们将要实现的效果的4倍放大图:
这个效果的特点如下:
文字部分有白色泛光效果,使之看起来就像是发光体。
按钮下半部分有椭圆形的放射渐变,但注意其上下并不对称。
接下来就开工制作,首先新建一个WPF应用程序,胡乱放上一些按钮用作测试:
在Window的资源中指定按钮的样式:
可以看到其基本结构非常简单,就是一个Border内装载着内容,而核心的样式其实都是在Border的Background属性里面定义的:
是的,在这里我们就是用到了VisualBrush,在他内部装载了一个拥有均分的两行的Grid,Grid的属性设置如下:
ClipToBounds="True" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"
VisualBrush的内部与其外部的布局毫不相干,所以如果不给Grid指定尺寸的话,它就会为0;而如果内部的显示比例不与外部统一的话,某些元素拉伸后也会比较难看。所以我将其尺寸绑定到了源控件的尺寸。
ClipToBounds属性用于指示是否剪裁溢出的元素,不剪裁的话有可能因溢出而增大元素占用尺寸,造成最终显示比例失调。
Grid的Backround属性只是定义了简单的界限分明的渐变作为背景:
<Grid.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FF95BCB9" Offset="0" />
<GradientStop Color="#FF294B53" Offset="0.5" />
<GradientStop Color="#000" Offset="0.5" />
</LinearGradientBrush>
</Grid.Background>
在Grid内部有一个Ellipse元素和两个ContentPresenter元素,两个ContentPresenter在这里都使用了模糊滤镜,来营造泛光效果,Ellipse就是实现底部的放射渐变,其代码如下:
<Ellipse Opacity="0.8" Grid.Row="1" Fill="#51EDFF" Height="{TemplateBinding Height}">
<Ellipse.BitmapEffect>
<BlurBitmapEffect Radius="55" />
</Ellipse.BitmapEffect>
</Ellipse>
其原理就是通过绑定Height属性来与按钮等高,然后将其置于Grid的第二行中,这样它的下半部分就会溢出Grid的下边界,而按钮内就只显示出它的上半部,此时再对其进行较大程度的模糊,便与背景结合而形成放射渐变效果。
如果去除它的模糊滤镜,那么看到的效果就是这样的:
来看看我们的最终效果:
本文的PDF版本下载:http://www.box.net/shared/j117u4qcyx