用VisualBrush定制复杂的按钮样式

简介:

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


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2008/09/18/1292958.html如需转载请自行联系原作者

相关文章
一个立体感的按钮样式
原文:一个立体感的按钮样式 ...
872 0
|
前端开发
uniapp checkbox样式失效,选中框选中按钮不显示
uniapp checkbox样式失效,选中框选中按钮不显示
375 0
tabBar选中的颜色的设置
tabBar选中的颜色的设置
487 0
tabBar选中的颜色的设置
生成具有三态背景图片的按钮
生成具有三态背景图片的按钮   class PussButton: # # 生成具有三态背景图片的按钮 # def init(self, *imgPath): from PyQt5.
878 0
设置滚动条样式,直接复制粘贴
::-webkit-scrollbar{width: 6px;height: 6px;} ::-webkit-scrollbar-thumb{background-color: #cfcfd2;border-radius: 8px;background-clip: padding-box;mi...
849 0
第56天:选中文字弹出提示框
一、选中文字弹出提示框 选择文字:  这个弹出的层 选中的时候不出来,弹起鼠标的时候才出现 。  所以这个的事件一定是  onmouseup  ,盒子显示而且盒子的位置 在  鼠标的 clientX  和 clientY 一模一样 用来判断选择的文字 二、获得用户选择内容 window.
913 1
|
小程序 JavaScript
小程序鼠标点击按钮(改变背景颜色字体)
小程序鼠标点击按钮(改变背景颜色字体)
114 0

热门文章

最新文章