假设需要实现一个图标和文本结合的按钮 ,普通做法是 直接重写该按钮的模板;

如果想作为通用的呢?

两种做法:

  1. 附加属性
  2. 自定义控件

推荐使用附加属性的形式

第一种:附加属性

创建Button的附加属性  ButtonExtensions

 1 public static class ButtonExtensions
2 {
3 // Using a DependencyProperty as the backing store for IconWidth. This enables animation, styling, binding, etc...
4 public static readonly DependencyProperty IconWidthProperty =
5 DependencyProperty.RegisterAttached("IconWidth", typeof(int), typeof(ButtonExtensions), new PropertyMetadata(0));
6
7 public static int GetIconWidth(DependencyObject obj)
8 {
9 return (int)obj.GetValue(IconWidthProperty);
10 }
11
12 public static void SetIconWidth(DependencyObject obj, int value)
13 {
14 obj.SetValue(IconWidthProperty, value);
15 }
16
17 // Using a DependencyProperty as the backing store for IconHeight. This enables animation, styling, binding, etc...
18 public static readonly DependencyProperty IconHeightProperty =
19 DependencyProperty.RegisterAttached("IconHeight", typeof(int), typeof(ButtonExtensions), new PropertyMetadata(0));
20
21 public static int GetIconHeight(DependencyObject obj)
22 {
23 return (int)obj.GetValue(IconHeightProperty);
24 }
25
26 public static void SetIconHeight(DependencyObject obj, int value)
27 {
28 obj.SetValue(IconHeightProperty, value);
29 }
30
31 // Using a DependencyProperty as the backing store for IconGeometry. This enables animation, styling, binding, etc...
32 public static readonly DependencyProperty IconGeometryProperty =
33 DependencyProperty.RegisterAttached("IconGeometry", typeof(Geometry), typeof(ButtonExtensions), new PropertyMetadata((object)null));
34
35 public static Geometry GetIconGeometry(DependencyObject obj)
36 {
37 return (Geometry)obj.GetValue(IconGeometryProperty);
38 }
39
40 public static void SetIconGeometry(DependencyObject obj, Geometry value)
41 {
42 obj.SetValue(IconGeometryProperty, value);
43 }
44
45 }

样式

 1 <ResourceDictionary
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:coreHelper="clr-namespace:NeonGenesis.Core.AttachedProperties;assembly=NeonGenesis.Core">
5 <Style x:Key="ButtonVerBase" TargetType="{x:Type Button}">
6 <Setter Property="BorderThickness" Value="0" />
7 <Setter Property="HorizontalContentAlignment" Value="Center" />
8 <Setter Property="VerticalContentAlignment" Value="Center" />
9 <Setter Property="Padding" Value="10,5" />
10 <Setter Property="FrameworkElement.Cursor" Value="Hand" />
11 <Setter Property="UIElement.SnapsToDevicePixels" Value="True" />
12 <Setter Property="coreHelper:ButtonExtensions.IconHeight" Value="24" />
13 <Setter Property="coreHelper:ButtonExtensions.IconWidth" Value="24" />
14 <Setter Property="Template">
15 <Setter.Value>
16 <ControlTemplate TargetType="{x:Type ButtonBase}">
17 <Border
18 Name="border"
19 Background="{TemplateBinding Background}"
20 BorderBrush="{TemplateBinding BorderBrush}"
21 BorderThickness="{TemplateBinding BorderThickness}"
22 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
23 <Grid>
24 <StackPanel
25 Margin="{TemplateBinding Padding}"
26 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
27 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
28 Orientation="Vertical">
29 <Path
30 Name="pathIcon"
31 Width="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(coreHelper:ButtonExtensions.IconWidth)}"
32 Height="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(coreHelper:ButtonExtensions.IconHeight)}"
33 Margin="0,0,0,5"
34 Data="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(coreHelper:ButtonExtensions.IconGeometry)}"
35 Fill="{TemplateBinding Foreground}"
36 Stretch="Uniform" />
37 <ContentPresenter
38 Name="contentPresenter"
39 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
40 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
41 Focusable="False"
42 RecognizesAccessKey="True"
43 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
44 </StackPanel>
45 </Grid>
46 </Border>
47 <ControlTemplate.Triggers>
48 <Trigger Property="coreHelper:ButtonExtensions.IconGeometry" Value="{x:Null}">
49 <Setter TargetName="pathIcon" Property="Visibility" Value="Collapsed" />
50 </Trigger>
51 <Trigger Property="Content" Value="{x:Null}">
52 <Setter TargetName="pathIcon" Property="Margin" Value="0" />
53 </Trigger>
54 </ControlTemplate.Triggers>
55 </ControlTemplate>
56 </Setter.Value>
57 </Setter>
58 </Style>
59 </ResourceDictionary>

使用示例

 1     <Button
2 Width="80"
3 Height="80"
4 coreHelper:ButtonExtensions.IconGeometry="{StaticResource RunningGeometry}"
5 coreHelper:ButtonExtensions.IconHeight="40"
6 coreHelper:ButtonExtensions.IconWidth="40"
7 Background="#1e90ff"
8 Content="运行"
9 Foreground="White"
10 Style="{StaticResource ButtonVerBase}" />

RunningGeometry为

<PathGeometry x:Key="RunningGeometry">M41.355947 0h572.962133a41.355947 41.355947 0 0 1 41.355947 41.355947v100.037973H0V41.355947A41.355947 41.355947 0 0 1 41.355947 0zM0 210.356907v772.287146A41.355947 41.355947 0 0 0 41.355947 1024h941.288106A41.355947 41.355947 0 0 0 1024 982.644053V210.356907z m851.88608 295.867733L581.973333 776.137387a47.786667 47.786667 0 0 1-66.710186 0.832853 47.786667 47.786667 0 0 1-7.796054-6.294187l-115.083946-115.0976-120.54528 120.558934a47.786667 47.786667 0 0 1-67.611307 0 47.786667 47.786667 0 0 1 0-67.611307l147.12832-147.12832a48.237227 48.237227 0 0 1 13.653333-9.557333 47.786667 47.786667 0 0 1 62.887254 4.096l119.6032 119.507626 236.776106-236.817066a47.786667 47.786667 0 0 1 67.611307 0 47.786667 47.786667 0 0 1 0 67.597653z</PathGeometry>

效果

第二种:自定义控件

后续更新

WPF 实现图标按钮的更多相关文章

  1. WPF实现Twitter按钮效果

    最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.com/css3-twit ...

  2. 添加“返回顶部”小图标按钮的JS(JavaScript)代码详解

    如何给自己的网站添加方便快捷的"返回顶部"小图标按钮呢?如下图: JS源代码: /** * JavaScript脚本实现回到页面顶部示例 * @param acceleration ...

  3. WPF 带清除按钮的文字框SearchTextBox

    原文:WPF 带清除按钮的文字框SearchTextBox 基于TextBox的带清除按钮的搜索框 样式部分: <!--带清除按钮文字框--> <Style TargetType=& ...

  4. wpf 状态栏图标背景闪烁提醒 FlashWindowEx

    原文:wpf 状态栏图标背景闪烁提醒 FlashWindowEx using System; using System.Runtime.InteropServices; using System.Wi ...

  5. WPF实现Twitter按钮效果(转)

    最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.com/css3-twit ...

  6. 在VS2005中设置WPF中自定义按钮的事件

    原文:在VS2005中设置WPF中自定义按钮的事件 上篇讲了如何在Blend中绘制圆角矩形(http://blog.csdn.net/johnsuna/archive/2007/08/13/17407 ...

  7. WPF字体图标——IconFont

    原文:WPF字体图标--IconFont 版权声明:本文为[CSDN博主:松一160]原创文章,未经允许不得转载. https://blog.csdn.net/songyi160/article/de ...

  8. WPF字体图标——FontAwesom

    原文:WPF字体图标--FontAwesom 版权声明:本文为[CSDN博主:松一160]原创文章,未经允许不得转载. https://blog.csdn.net/songyi160/article/ ...

  9. [原译]一步步教你制作WPF圆形玻璃按钮

    原文:[原译]一步步教你制作WPF圆形玻璃按钮 图1 1.介绍 从我开始使用vista的时候,我就非常喜欢它的圆形玻璃按钮.WPF最好的一个方面就是允许自定义任何控件的样式.用了一段时间的Micros ...

  10. WPF 给Button按钮加小图标图片Image

    前言:当WPF项目后台完成到一定程度的时候,就可以对XAML前端进行美化啦,个人认为XAML前端还是挺有意思的. 下面举一个Button加过小图标后的例子: 是不是比生硬的文字看来更人性化了呢? 不多 ...

随机推荐

  1. 【读论文】CM-Gen: A Neural Framework for Chinese Metaphor Generation with Explicit Context Modelling

    为了更好的阅读体验,请点击这里 由于发不出论文,所以找点冷门方向做一做.从汉语比喻开始. 读完这篇论文之后我觉得 COLING 这方向我上我也行(ε=ε=ε=┏(゜ロ゜;)┛ 题目:CM-Gen: A ...

  2. ARM 命名规则和ARM 版本

    结论:我们所接触到提到的命名规则,应该分成两类. 基于ARM Architecture版本的"指令集架构"命名规则:例如armv6, armv7, armv7s, arm64 等系 ...

  3. 通过Docker搭建Debezium同步MySQL的数据变化

    Debezium是红帽开发的一款CDC产品,和阿里的Canel类似,都是同步binlog,不过强大了一点点.为了不再麻烦,下面称之为dbz. 达拉崩吧斑得贝迪卜多比鲁翁... dbz的搭建依赖很多中间 ...

  4. debian12 创建本地harbor镜像库

    前言 harbor是一个docker/podman镜像管理库,可用于存储私人镜像.现将本人在debian12系统搭建harbor镜像库的过程记录下来,留作后续参考. 可以参考github harbor ...

  5. Spring中文官方文档

    Spring 中文文档 https://springdoc.cn/ Spring Boot 中文文档 https://www.docs4dev.com/docs/zh/spring-boot/1.5. ...

  6. Redis缓存雪崩,击穿,穿透以及解决方案

    Redis读写过程 一般情况下,Redis都是作为client与MySQL间的一层缓存,尽量减少MySQL的读压力,数据流向如图所示: Redis的五种数据类型及使用场景 String 这个其实没啥好 ...

  7. Sql Server 按日统计产量

    碰到一个这样的需求,需要查询每天的产量,直接 group 是可以分出不同天的产量,但是如果当天没有生产,就会少一条那一天的记录,而不是那一天显示产量为0,这样不方便前端显示曲线. 于是找到下面的办法, ...

  8. 2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。 一个子数组nums[i.

    2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1.0和1. 一个子数组nums[i. ...

  9. 解决方案 | pyautogui实现等待特定图片(对话框)出现(可设置等待超时时间)

    1.问题 为了等待某个[转换完毕]的图片(对话框)出现,如何设置? 2.解决方案代码如下 下面代码实现的是:设置超时时间为10s,当你在完成前序工作以后,代码开始进入等待,一旦你的特定图片出现了,马上 ...

  10. 基于MindSpore实现BERT对话情绪识别

    本文分享自华为云社区<[昇思25天学习打卡营打卡指南-第二十四天]基于 MindSpore 实现 BERT 对话情绪识别>,作者:JeffDing. 模型简介 BERT全称是来自变换器的双 ...