WPF 自定义 ImageButton
控件源码:
public class ImageButton : Button
{
public ImageButton() {
}
public string NoramlImgPath
{
get { return (string)GetValue(NoramlImgPathProperty); }
set { SetValue(NoramlImgPathProperty, value); }
}
public string HoverImgPath
{
get { return (string)GetValue(HoverImgPathProperty); }
set { SetValue(HoverImgPathProperty, value); }
}
public string DisableImgPath
{
get { return (string)GetValue(DisableImgPathProperty); }
set { SetValue(DisableImgPathProperty, value); }
}
public static readonly DependencyProperty NoramlImgPathProperty =
DependencyProperty.Register(
"NoramlImgPath",
typeof(string),
typeof(ImageButton),
new PropertyMetadata(""));
public static readonly DependencyProperty HoverImgPathProperty =
DependencyProperty.Register(
"HoverImgPath",
typeof(string),
typeof(ImageButton),
new PropertyMetadata(""));
public static readonly DependencyProperty DisableImgPathProperty =
DependencyProperty.Register(
"DisableImgPath",
typeof(string),
typeof(ImageButton),
new PropertyMetadata(""));
}
Style:资源文件里需要引用控件Namespace
xmlns:local="clr-namespace:Shared.Controls;assembly=Shared"
<SolidColorBrush x:Key="MouseOverBorderBrush" Color="#2D2F3D" />
<SolidColorBrush x:Key="buttonDisableBackground" Color="#222732"/>
<Style x:Key="imageButtonStyle" TargetType="local:ImageButton">
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ImageButton}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" SnapsToDevicePixels="True">
<Rectangle x:Name="bgrect" Margin="2">
<Rectangle.Fill>
<ImageBrush ImageSource="{Binding NoramlImgPath, RelativeSource={RelativeSource TemplatedParent}}" Stretch="Uniform" />
</Rectangle.Fill>
</Rectangle>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" TargetName="border" Value="#000000"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource MouseOverBorderBrush}"/>
<Setter Property="BorderThickness" TargetName="border" Value="1"/>
<Setter Property="Margin" TargetName="border" Value="-1"/>
<Setter TargetName="bgrect" Property="Fill">
<Setter.Value>
<ImageBrush ImageSource="{Binding HoverImgPath, RelativeSource={RelativeSource TemplatedParent}}" Stretch="Uniform" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" TargetName="border" Value="#000000"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource MouseOverBorderBrush}"/>
<Setter Property="BorderThickness" TargetName="border" Value="1"/>
<Setter Property="Margin" TargetName="border" Value="1 1 -1 -1"/>
<Setter TargetName="bgrect" Property="Fill">
<Setter.Value>
<ImageBrush ImageSource="{Binding HoverImgPath, RelativeSource={RelativeSource TemplatedParent}}" Stretch="Uniform" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" TargetName="border" Value="{StaticResource buttonDisableBackground}"/>
<Setter TargetName="bgrect" Property="Fill">
<Setter.Value>
<ImageBrush ImageSource="{Binding DisableImgPath, RelativeSource={RelativeSource TemplatedParent}}" Stretch="Uniform" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用:
xmlns:shared="clr-namespace:Shared.Controls;assembly=Shared"
<shared:ImageButton Width="24" Height="24" Margin="0 5" Command="{Binding SaveImageCommand}"
NoramlImgPath="../Images/export_image.png"
HoverImgPath="../Images/export_image_hover.png"
Style="{StaticResource imageButtonStyle}" ></shared:ImageButton>
显示:
政常:
鼠标放上:
点击:
WPF 自定义 ImageButton的更多相关文章
- WPF 自定义柱状图 BarChart
WPF 自定义柱状图 当前的Telerik控件.DevExpress控件在图表控件方面做得不错,但是有时项目中需要特定的样式,不是只通过修改图表的模板和样式就能实现的. 或者说,通过修改当前的第三方控 ...
- wpf 自定义圆形按钮
wpf 自定义圆形按钮 效果图 默认样式 获取焦点样式 点击样式 下面是实现代码: 一个是自定义控件类,一个是控件类皮肤 using System; using System.Collections. ...
- WPF自定义窗口基类
WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...
- WPF 自定义 MessageBox (相对完善版)
WPF 自定义 MessageBox (相对完善版) 基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当 ...
- WPF自定义Window样式(2)
1. 引言 在上一篇中,介绍了如何建立自定义窗体.接下来,我们需要考虑将该自定义窗体基类放到类库中去,只有放到类库中,我们才能在其他地方去方便的引用该基类. 2. 创建类库 接上一篇的项目,先添加一个 ...
- WPF自定义Window样式(1)
1. 引言 WPF是制作界面的一大利器.最近在做一个项目,用的就是WPF.既然使用了WPF了,那么理所当然的,需要自定义窗体样式.所使用的代码是在网上查到的,遗憾的是,整理完毕后,再找那篇帖子却怎么也 ...
- WPF自学入门(九)WPF自定义窗口基类
今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...
- WPF自定义TabControl样式
WPF自定义TabControl,TabControl美化 XAML代码: <TabControl x:Class="SunCreate.Common.Controls.TabCont ...
- WPF 自定义ComboBox样式,自定义多选控件
原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...
随机推荐
- Python并发编程之初识异步IO框架:asyncio 上篇(九)
大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...
- Text-CNN-文本分类-keras
Text CNN 1. 简介 TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 "Convolutional Neural Networks for Sent ...
- Javascript的内存泄漏分析
作为程序员(更高大尚的称谓:研软件研发)的我们,无论是用Javascript,还是.net, java语言,肯定都遇到过内存泄漏的问题.只不过他们都有GC机制来帮助程序员完成内存回收的事情,如果你是C ...
- pytest-allure-poco之allure全量详细用法
allure简介 Allure Framework是一个灵活的轻量级多语言测试报告工具.貌似是目前最漂亮的一个报告工具 python版本及必要库或工具 python 3.7 pytest 4.3.1 ...
- Netty源码—七、内存释放
Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置.所以要理解Netty内存的释放我们得先看下直接内存的释放. Java直接内存释放 我们先来看下直接内存是怎么使用 ...
- 设计模式 | 简单工厂模式(static factory method)
按理说应该把书全都看完一遍,再开始写博客比较科学,会有比较全面的认识. 但是既然都决定要按规律更新博客了,只能看完一个设计模式写一篇了. 也算是逼自己思考了,不是看完就过,至少得把代码自己都敲一遍. ...
- Android 个人手机通讯录开发
一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示 2. ...
- SQL Server存储过程邮件发送以表格方式发送
一.收到邮件显示:示例 二.存储过程代码部分: BEGIN SET NOCOUNT ON; --初始化 Declare @MailTo nvarchar(max) Declare @MailCc nv ...
- July 01st. 2018, Week 27th. Sunday
Empty your cup so that it may be filled. 清空杯子,方能再次装满. From Bruce Lee. We can't learn anything new if ...
- Linux 桌面玩家指南:12. 优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...