wpf研究之道——自定义Button控件
我们知道WPF中普通的按钮,长得丑,所以自定义按钮,在所难免。我们给按钮添加 MoveBrush,EnterBrush两把刷子,其实就是鼠标经过和鼠标按下的效果。只不过这不是普通的刷子,而是带图片的ImageBrush刷子。
public class ShareButton : Button
{
/// <summary>
/// 鼠标移走
/// </summary>
public static readonly DependencyProperty MoveBrushProperty;
public Brush MoveBrush
{
set
{
base.SetValue(ShareButton.MoveBrushProperty, value);
}
get
{
return base.GetValue(ShareButton.MoveBrushProperty) as Brush;
}
}
public static readonly DependencyProperty EnterBrushProperty;
/// <summary>
/// 鼠标进入
/// </summary>
public Brush EnterBrush
{
set
{
base.SetValue(ShareButton.EnterBrushProperty, value);
}
get
{
return base.GetValue(ShareButton.EnterBrushProperty) as Brush;
}
}
static ShareButton()
{
//注册属性
ShareButton.MoveBrushProperty = DependencyProperty.Register("MoveBrush", typeof(Brush), typeof(ShareButton), new PropertyMetadata(null));
ShareButton.EnterBrushProperty = DependencyProperty.Register("EnterBrush", typeof(Brush), typeof(ShareButton), new PropertyMetadata(null));
FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(ShareButton), new FrameworkPropertyMetadata(typeof(ShareButton)));
}
public ShareButton()
{
base.Content = "";
}
}
从代码中可以看出,DependencyProperty MoveBrushProperty是个依赖属性,MoveBrush提供了对MoveBrushProperty属性的封装。那问题来了,什么是依赖属性?
传统中.net framework中的属性,也被称为CLR属性,它在实例化的时候会分配数据存储空间。而包含依赖属性的对象被称为依赖对象,它在实例化的时候并不会直接分配数据存储空间,而是保留了这样的分配能力。如果说,我们直接给这个依赖属性赋值的话,它才开始分配空间,如果它依赖于其它对象的话,也就是说,这个依赖属性的值是从其它对象那儿”拿来”的话,就不用分配内存了,而是需要绑定。
我查看了下Button的类层次结构:

Button: ButtonBase:ContentControl,因此我们自定义的 ShareButton继承自Button,自然是依赖对象,所以理所当然地可以自定义依赖属性了。
再来看看这个控件如何使用?
1、添加命名空间: xmlns:s="clr-namespace:ShareControl;assembly=ShareControl"
2、这是一个登陆按钮
<s:ShareButton x:Name="btnLogin" Click="btnLogin_Click" FontSize="" Content="登 录" Width="" Height="" Foreground="White" Cursor="Hand" IsDefault="True">
<s:ShareButton.EnterBrush>
<ImageBrush ImageSource="Skin/Icon/login_button.png"/>
</s:ShareButton.EnterBrush>
<s:ShareButton.MoveBrush>
<ImageBrush ImageSource="Skin/Icon/login_button_hover.png"/>
</s:ShareButton.MoveBrush>
<s:ShareButton.Background>
<ImageBrush ImageSource="Skin/Icon/login_button.png"/>
</s:ShareButton.Background>
</s:ShareButton>
运行效果:

鼠标经过时,是另外一个背景

自定义按钮长得这么漂亮,肯定需要样式的支持:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ShareControl"> <Style x:Key="{x:Type local:ShareButton }" TargetType="{x:Type local:ShareButton}"> <Setter Property="FocusVisualStyle" Value="{x:Null}"/> <Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ShareButton}">
<Border Name="border" BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="{TemplateBinding Control.BorderThickness}" SnapsToDevicePixels="True" Width="{TemplateBinding FrameworkElement.Width}" Height="{TemplateBinding FrameworkElement.Height}" Background="{TemplateBinding Control.Background}">
<ContentPresenter Name="contentPresenter" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Focusable="False" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="UIElement.IsMouseOver" Value="True">
<Setter TargetName="border" Value="{Binding MoveBrush, RelativeSource={RelativeSource TemplatedParent}}" Property="Border.Background" />
</Trigger>
<Trigger Property="ButtonBase.IsPressed" Value="True">
<Setter TargetName="border" Value="{Binding EnterBrush, RelativeSource={RelativeSource TemplatedParent}}" Property="Border.Background" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
wpf研究之道——自定义Button控件的更多相关文章
- WPF 自定义Button控件及样式
这次通过最近做的小例子说明一下自定义Button控件和样式. 实现的效果为:
- 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件
好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...
- WPF开发随笔收录-自定义图标控件
一.前言 1.在以前自学的过程中,软件需要使用到图标的时候,总是第一个想法是下载一个图片来充当图标使用,但实际得出来的效果会出现模糊的现象.后来网上学习了字体图标库的用法,可以在阿里云矢量图网站那里将 ...
- 如何自定义MVC控件?
今天公司要写学习总结,想着想着还是先写一篇关于MVC内部什么东东的博客整理整理再发表吧,一举两得. 之前写过了路由.过滤器等.今天就研究一下怎么自定义MVC控件吧. 本人技术小菜,不喜勿喷.....( ...
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- WPF时间长度自定义选择控件TimeSpanBox
以下控件采用https://www.cnblogs.com/cssmystyle/archive/2011/01/17/1937361.html部分代码 以下控件采用https://www.cnblo ...
- WPF自定义控件与样式(10)-进度控件ProcessBar自定义样
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: Pro ...
- WPF 自定义分页控件二
一:添加自定义分页控件,命名为KDataPagerTwo: public class KDataPagerTwo : Control, INotifyPropertyChanged { static ...
- 继续聊WPF——自定义CheckBox控件外观
上一篇文章中谈到了BulletDecorator控件,就是为自定义CheckBox控件的模板做准备,因为CheckBox需要比较严格的布局,正好,BulletDecorator控件就合适了,该控件的布 ...
随机推荐
- vue 路由懒加载 使用,优化对比
vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运 ...
- Mybatis使用总结-思维导图
目前使用到Mybatis的总结,缓存还未涉及:
- 《android开发进阶从小工到专家》读书笔记--网络框架的设计与实现
第一步: 第一层:Request--请求类型,JSON,字符串,文件 第二层:消息队列--维护了提交给网络框架的请求列表,并且根据响应的规则进行排序.默认情况下按照优先级和进入队列的顺序来执行,该队列 ...
- MyCat 枚举分片设计思考,查询命中条件
Mycat多租户实现的两种方式 MyCat,各种分片规则,仅保证插入的时候分片.表关联,join,查询怎么命中分片条件,还是需要设计. 今天稍微测了一下. ER 分片,此方式,插入的时候能分片,但是查 ...
- linux主机名为bogon的原因及修改方法
今天登录linux,发现主机名是bogon,虽然不影响使用,但是看着很不爽,于是想了解一下,为什么会发生这种情况,在csdn上找了到了一个文章,原文如下: 起因:公司网络接口做了接口认证,虚拟机桥接至 ...
- 借助TZImagePickerController三方库理解自定义相册
借助TZImagePickerController三方库理解自定义相册 1.整体架构分析 整体框架大致可以分为几个部分 <1>工具类-TZImageManager:这个类主要是工作是提供一 ...
- 网络基础tcp/ip协议二
物理层解析: 物理层是TCP/IP模型的最低层,物理层为数据提供数据传输可靠通路. 物理层关心的介质: 信号 接口 传输介质 信号的分类:(信号是信息传递的媒介.) 模拟信号:连续变化的物理量 数字信 ...
- 用dd实现linux硬盘备份
一个去年的老本,500G硬盘,空间各种捉急,准备迁移到公司的台式机上,却发现Linux上迁移环境没有Windows下那么方便,只能复制整块硬盘了. 从公司拿了一块1T的硬盘,插入移动硬盘盒(淘宝上搞的 ...
- jlink烧写Nor Flash时出错正确解决方法汇总:PC of target system has unexpected value after programming
成都国嵌的课程:国嵌体验入门班-2-1(开发板系统安装-Jlink方式).rar毒害了不少人,那种直接烧写nor flash,不进行任何配置的方法,能够成功纯属偶然,他自己在视频中烧写时也出现了两次错 ...
- VxWorks下USB驱动总结1
1.USB设备 物理特征:4条电缆,电源线.地线.数据线.脉冲线; 速 度:低速1.5Mbps,全速12Mbps,高速480Mbps; 规范版本:1998年USB1.1,2000年USB2.0; 连 ...