VisualBrush是一种比较特殊的笔刷,它的功能仍然是用来给元素填充图案,但它的内容却可以是各种控件。

你可以将其理解为一个普通的容器,但在其内部的所有控件都会失去交互能力,而只保留显示能力。

你可以通过本例学习到关于VisualBrush的使用方法,以及复杂样式的定制技巧。

首先来看一下我们将要实现的效果的4倍放大图:

这个效果的特点如下:

文字部分有白色泛光效果,使之看起来就像是发光体。

按钮下半部分有椭圆形的放射渐变,但注意其上下并不对称。

接下来就开工制作,首先新建一个WPF应用程序,胡乱放上一些按钮用作测试:

Window的资源中指定按钮的样式:

可以看到其基本结构非常简单,就是一个Border内装载着内容,而核心的样式其实都是在BorderBackground属性里面定义的:

是的,在这里我们就是用到了VisualBrush,在他内部装载了一个拥有均分的两行的GridGrid的属性设置如下:

ClipToBounds="True" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"

VisualBrush的内部与其外部的布局毫不相干,所以如果不给Grid指定尺寸的话,它就会为0;而如果内部的显示比例不与外部统一的话,某些元素拉伸后也会比较难看。所以我将其尺寸绑定到了源控件的尺寸。

ClipToBounds属性用于指示是否剪裁溢出的元素,不剪裁的话有可能因溢出而增大元素占用尺寸,造成最终显示比例失调。

GridBackround属性只是定义了简单的界限分明的渐变作为背景:

<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

源文件下载:http://www.box.net/shared/66e2tvbfph

posted on 2008-09-18 04:54  斯克迪亚  阅读(6734)  评论(13编辑  收藏  举报