WPF 自定义Button控件及样式
这次通过最近做的小例子说明一下自定义Button控件和样式。
实现的效果为:
在讲解之前先分析一下:
这上面为八个按钮,这是毫无疑问的。在每个按钮中又包含了一个图片和文本两个元素。虽然有这么多按钮,但他们的样式基本相同,除了按钮中的图片和文字内容。所以我们可以把相同的部分提取出来,把不同的内容进行传参来实现不同的效果。
继续分析,在按钮中包含的这两个元素,一个是图片元素,一个是文本元素。先说文本元素,文本元素直接可以通过Button.Content直接赋值。但Image控件的Source属性不能通过Button中任何一个属性给它赋值。所以想 如果Button有个像Image控件一样的Source属性,并通过这两个进行Binding,那么这两个元素就都可以通过Button自身的属性就可以直接赋值。分析结果:
①要先自定义一个MyButton类,继承自Button。 给MyButton注册一个依赖属性 ImgSourceProperty,类型为ImageSource。这个Image控件的Source属性基本一样。
/// <summary>
/// 自定义Button控件
/// </summary>
public class MyButton:Button
{
//定义Imagesource依赖属性
public static readonly DependencyProperty ImgSourceProperty = DependencyProperty.Register
("ImgSource", typeof(ImageSource), typeof(MyButton), null);
public ImageSource ImgSource
{
get { return (ImageSource)GetValue(ImgSourceProperty); }
set { SetValue(ImgSourceProperty, value); }
}
}
②定义一个通用样式,在这里定义的样式其实是修改了Button模板
<Application x:Class="Test13.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Test13" //要注意引用你自定义控件的命名控件
StartupUri="MainWindow.xaml">
<Application.Resources>
<Style x:Key="sysStatusButton"
TargetType="{x:Type local:MyButton}">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyButton}">
<Border x:Name="border"
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="0"
Background="#2d548e"
CornerRadius="5,5,5,5">
<StackPanel Orientation="Horizontal">
<Image VerticalAlignment="Center"
Width="27"
Height="27"
Margin="5,0,0,0"
Source="{TemplateBinding ImgSource}"></Image> //这里把模板中Image控件的source属性Binding到自定义控件的ImgSource属性上。
<TextBlock VerticalAlignment="Bottom"
x:Name="textBlock"
Margin="5,0,0,7"
FontSize="12"
Foreground=" White"
Text="{TemplateBinding Content}"></TextBlock> //这里的文本控件直接绑定的是Button的Content内容。
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="border" Property="Border.Background" Value="#FF9900" />
<Setter TargetName="textBlock" Property="TextBlock.Foreground" Value="black" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
</Application.Resources>
</Application>
③接下来就是在XAML中声明控件,当给自定义控件的这两个属性赋值时,在上面的样式中就会给Image控件和TextBlock赋值。
<local:MyButton Content="系统状态监控" Height="40" Width="132"
Style="{StaticResource sysStatusButton}"
ImgSource="/Test13;component/Images/2.png"
Click="MyButton_Click" />
<local:MyButton Content="设备监控列表"
Height="40"
Width="132"
Margin="5,0,5,0"
Style="{StaticResource sysStatusButton}"
ImgSource="/Test13;component/Images/3.png"
Click="MyButton_Click_1" />
WPF 自定义Button控件及样式的更多相关文章
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- WPF 动态添加控件以及样式字典的引用(Style introduction)
原文:WPF 动态添加控件以及样式字典的引用(Style introduction) 我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的 ...
- 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件
好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...
- 论如何在手机端web前端实现自定义原生控件的样式
手机开发webapp的同学一定遇到过这样问题,如何为丑极了的手机元素应用自定义的样式.首先,要弄清楚为什么要定义手机原生控件的样式,就需要看看手机的那些原生框样式的丑陋摸样: android: ios ...
- 浅尝辄止WPF自定义用户控件(实现颜色调制器)
主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...
- WPF 自定义分页控件二
一:添加自定义分页控件,命名为KDataPagerTwo: public class KDataPagerTwo : Control, INotifyPropertyChanged { static ...
- Android UI 统一修改Button控件的样式,以及其它系统控件的默认样式
先介绍下修改原理:首先打开位于android.widget包下面的Button.java文件,这里有一句关键的代码如下: public Button(Context context, Attribut ...
- 继续聊WPF——自定义CheckBox控件外观
上一篇文章中谈到了BulletDecorator控件,就是为自定义CheckBox控件的模板做准备,因为CheckBox需要比较严格的布局,正好,BulletDecorator控件就合适了,该控件的布 ...
- wpf研究之道——自定义Button控件
我们知道WPF中普通的按钮,长得丑,所以自定义按钮,在所难免.我们给按钮添加 MoveBrush,EnterBrush两把刷子,其实就是鼠标经过和鼠标按下的效果.只不过这不是普通的刷子,而是带图片的I ...
随机推荐
- WPF 界面布局DockPanel stackPanel WrapPanel 元素内容以及位置控制
1 DockPanel 1) 默认充满整个窗口. 2) 最后一个出现的部分,默认充满剩余空间. 3) 非最后一个出现的部分,根据其中内容,进行分配空间s 2 StackPanel 实现居左,居右,居中 ...
- 【HDOJ】3592 World Exhibition
基础差分约束. /* 3592 */ #include <iostream> #include <algorithm> #include <queue> #incl ...
- HDU-1035 Robot Motion
http://acm.hdu.edu.cn/showproblem.php?pid=1035 Robot Motion Time Limit: 2000/1000 MS (Java/Others) ...
- Xcode5最初级的教程
相信IT男们,总会有那么一天希望自己捣鼓一个小App 让女朋友开心一下.那么就有了本文的开始的动机,话说带着兴趣做事情的时候进度是最快的也是最轻松的,这也是因为为什么有女朋友陪着的时候走多远的路脚都不 ...
- redis ins 调试
Redis简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工 ...
- zabbix web场景模拟监控配置
一,zabbix2.2.3 VMware Vsphere exsi监控配置步骤, 1,添加监控主机 2,添加聚集macro;{$PASSWORD} = yoodo.com{$URL} = http:/ ...
- 将证书写到jre中
第一步: 取得要导入的证书. 第二步: 开启CMD,进入Java/jre6/lib/security 目录下. 第三步: 执行以下命令: keytool -import -alias cacerts ...
- An Easy Problem?! - POJ 2826(求面积)
题目大意:有两块木板交叉起来接雨水,问最多能接多少. 分析:题目描述很简单,不过有些细节还是需要注意到,如下图几种情况: #include<stdio.h> #include< ...
- 正经学C#_变量与其转换:《c#入门经典》
上一节上了变量.末尾简单了说了下 命名方式,声明变量. 命名方式在C#,或者任何语言都是非常重要的一门学问.值得去深入思考一下.变量名的优化与其工作效率的提升,有很多大的关系的. 声明变量,上节介绍了 ...
- 基于Centos6.x定制化安装步骤
1.获取安装界面代码 挂载image/install.img:mount image/install.img /mnt/5 -o loop 复制挂载后的代码至self_intall ...