这次通过最近做的小例子说明一下自定义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控件及样式的更多相关文章

  1. WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...

  2. WPF 动态添加控件以及样式字典的引用(Style introduction)

    原文:WPF 动态添加控件以及样式字典的引用(Style introduction) 我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的 ...

  3. 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件

        好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...

  4. 论如何在手机端web前端实现自定义原生控件的样式

    手机开发webapp的同学一定遇到过这样问题,如何为丑极了的手机元素应用自定义的样式.首先,要弄清楚为什么要定义手机原生控件的样式,就需要看看手机的那些原生框样式的丑陋摸样: android: ios ...

  5. 浅尝辄止WPF自定义用户控件(实现颜色调制器)

    主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...

  6. WPF 自定义分页控件二

    一:添加自定义分页控件,命名为KDataPagerTwo: public class KDataPagerTwo : Control, INotifyPropertyChanged { static ...

  7. Android UI 统一修改Button控件的样式,以及其它系统控件的默认样式

    先介绍下修改原理:首先打开位于android.widget包下面的Button.java文件,这里有一句关键的代码如下: public Button(Context context, Attribut ...

  8. 继续聊WPF——自定义CheckBox控件外观

    上一篇文章中谈到了BulletDecorator控件,就是为自定义CheckBox控件的模板做准备,因为CheckBox需要比较严格的布局,正好,BulletDecorator控件就合适了,该控件的布 ...

  9. wpf研究之道——自定义Button控件

    我们知道WPF中普通的按钮,长得丑,所以自定义按钮,在所难免.我们给按钮添加 MoveBrush,EnterBrush两把刷子,其实就是鼠标经过和鼠标按下的效果.只不过这不是普通的刷子,而是带图片的I ...

随机推荐

  1. 【HDOJ】1429 胜利大逃亡(续)

    BFS+状态压缩,做了很多状态压缩了.今晚把八数码问题给搞定了. #include <iostream> #include <queue> #include <cstri ...

  2. 悟透Javascript undefined,null,"",0这四个值转换为逻辑值时就是false &this关键字

    话题一:undefined,null,"",0这四个值转换为逻辑值时就是false 也就是在if判断时会把上面的五个作为false来判断.但是它们的类型确是不尽相同的,如下所示. ...

  3. poj3373

    其实这道题只告诉了一个事当出现多个满足答案约束条件是,我们可以求一个再求一个,不要一下子全求完前两个条件怎么弄之前已经做过类似的了于是我们可以用记忆化搜索找出最小差异然后配合最小差异来剪枝,搜索出最小 ...

  4. Azure SQL 数据库的灵活缩放预览版简介

    Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...

  5. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE

    (转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDA ...

  6. 导入 from pdfminer.pdfinterp import process_pdf 错误

    >>> from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter>>> from ...

  7. Java---网络编程(4)-C/S-B/S

    C/S 与 B/S ☆ C/S ( Client/Server ) 客户端和服务端的特点 1.客户端和服务端的软件都需要程序员进行编写. 2.客户端维护起来较为麻烦.(缺陷) 3.客户端的存在可以将一 ...

  8. Android项目开发全程(二)--Afinal用法简单介绍

    本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...

  9. Leetcode那点事儿

    1 .Two Sum 2.Add Two Numbers 3.Longest Substring Without Repeating Characters 7.Reverse Integer  26. ...

  10. Android模拟器的ip获取以及模拟器之间socket通信

    Android模拟器的ip获取以及模拟器之间socket通信           http://kalogen.iteye.com/blog/1565507 作者:李波 实现网络五子棋时用到了两个设备 ...