WPF编程之自定义Button控件样式

  自.NET Framework 3.0 以后,WPF编程框架可使开发人员开发出更加令人耳目一新的桌面应用程序。它使开发工作更加方便快捷,它将设计人员和编程人员的工作分离开来。至于WPF的背景历史、框架特点、框架结构这里就不再赘述。有兴趣的同袍可在百度搜索关于WPF的相关知识介绍,如WPF

  在微软在WPF框架里提供了一些基础功能各异的控件,例如Button、TextBox、Label、Panel、TextBlock等等。微软将这些组件可视化集成到Visual Studio集成开发工具中了,这在实际生产环境中将有利于提升我们的开发效率。我们可以自己打开Visual Studio 新建WPF应用来使用这些控件。如下图:


?WPF中提供的默认各式功能控件

  在上图窗体中,WPF提供了不同功能控件,并且有各自默认的外观样式。如果说我们为客户定制一套系统,客户对系统界面人机交互体验有着强烈要求,那么控件默认的默认交互方式和外观样式有时候就无法满足用户的需求了。

  例如Button控件,基本以按钮形式呈现,按钮默认为灰色,当用户鼠标悬浮在按钮上时候按钮颜色发生变化,当用户点击按钮后,按钮获取焦点且按钮上呈现虚线矩形。下面,我们以按钮控件为例,介绍下如何通过自定义控件的样式达到优化控件的目的。首先我们看下最终效果,按钮上显示了一个图标和一串文本字符,鼠标滑动到按钮控件上时候,控件原有的光亮区域发生变化,然后用户点击按钮时按钮背景变为纯色。

?

  下面我们分析上面按钮的构成原理。一般普通按钮中多为文本内容,在此示例按钮中左侧为一个图标,右侧为文本。如下图所示,在按钮(蓝色)内容中嵌套一个布局Grid(紫色),我们将Grid设置为一行两列形式,之后在第一列布局Image显示图标(黄色),第二列布局ContentPresenter呈现文本(红色)。

  那么如何实现上述按钮呢,这就要使用WPF中样式和模板了。

  定义一个测试按钮如下:

1  <Button Height="30" Width="140">测试按钮</Button>

  定义完按钮后我们还需要在当前窗体资源里定义一个样式资源,当然你也可以单独定义到资源字典文件里,这里我们将TargetType设置为Button:

1 <Window.Resources>
2         <Style TargetType="Button">
3             <Style.Setters>
4                ··· ···
5             </Style.Setters>
6         </Style>
7 </Window.Resources>

  下面为测试按钮定义ControlTemplate模板:

 1 <Setter Property="Template">
 2             <Setter.Value>
 3                 <ControlTemplate TargetType="Button">
 4                     <!--定义圆角外边框-->
 5                     <Border Name="gridborder" BorderBrush="#87CEFA" BorderThickness="1"  CornerRadius="3" >
 6                         <Border.Background>
 7                             <!--定义圆角外边框背景-->
 8                             <LinearGradientBrush StartPoint="0 1" EndPoint="0 0">
 9                                 <GradientStop Color="#87CEFA" Offset="0.2"/>
10                                 <GradientStop Color="#FFFFFF" Offset="0.6"/>
11                                 <GradientStop Color="#87CEFA" Offset="0.99"/>
12                             </LinearGradientBrush>
13                         </Border.Background>
14                         <!--定义Grid-->
15                         <Grid>
16                             <Grid.ColumnDefinitions>
17                                 <ColumnDefinition/>
18                                 <!--定义Grid第一列-->
19                                 <ColumnDefinition/>
20                                 <!--定义Grid第二列-->
21                             </Grid.ColumnDefinitions>
22                             <!--定义Image-->
23                             <Image Source="img\download.png" Height="20" Width="20" VerticalAlignment="Center"/>
24                             <!--定义ContentPresenter-->
25                             <ContentPresenter Grid.Column="1" Content="{TemplateBinding Content}" VerticalAlignment="Center"/>
26                         </Grid>
27                     </Border>
28                 </ControlTemplate>
29             </Setter.Value>
30         </Setter>

  接下来我们在模板触发器里添加鼠标进入按钮和鼠标点击按钮时效果,当鼠标进入按钮时,我们修改先前定义的gridborder的背景:

 1 <Trigger Property="IsMouseOver"  Value="True">
 2         <Setter TargetName="gridborder" Property="Background">
 3                 <Setter.Value>
 4                     <LinearGradientBrush StartPoint="0 1" EndPoint="0 0">
 5                         <GradientStop Color="#87CEEB" Offset="0.1"/>
 6                         <GradientStop Color="#FFFFFF" Offset="0.5"/>
 7                         <GradientStop Color="#87CEEB" Offset="0.91"/>
 8                     </LinearGradientBrush>
 9                 </Setter.Value>
10         </Setter>
11 </Trigger>

  当鼠标点击按钮时修改定义的gridborder的背景为纯色:

1 <Trigger Property="IsPressed"  Value="True">
2          <Setter TargetName="gridborder" Property="BorderThickness" Value="2"/>
3          <Setter TargetName="gridborder" Property="Background" Value="#87CEFA"/>
4 </Trigger>

  到这里我们对Button按钮的样式和模板定义就基本完成了。

原文地址:https://www.cnblogs.com/qlzc/p/9977596.html

时间: 2024-10-13 20:44:58

WPF编程之自定义Button控件样式的相关文章

wpf 自定义RadioButton控件样式

实现的效果为: 我感觉来自定义RadioButton样式和定义button空间的样式差不多,只是类型不同而已. 接下来分析一下样式代码: <!--自定义单选按钮样式-->        <Style TargetType="RadioButton"> <Setter Property="Template">                <Setter.Value>                    <Con

WPF 自定义TabControl控件样式

一.前言 程序中经常会用到TabControl控件,默认的控件样式很普通.而且样式或功能不一定符合我们的要求.比如:我们需要TabControl的标题能够居中.或平均分布:或者我们希望TabControl的标题能够进行关闭.要实现这些功能我们需要对TabControl的样式进行定义. 二.实现TabControl的标题平均分布 默认的TabControl标题是使用TabPanel容器包含的.要想实现TabControl标题头平均分布,需要把TabPanel替换成UniformGrid: 替换后的

arcgis api for js共享干货系列之二自定义Navigation控件样式风格

arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义一个NavigationControl控件类,最终实现的效果如下图: 思路如下:其实就是在网上参照天地图或者谷歌地图的Navigation风格样式,下载它们的图片模版,然后自己创建div来实现图片的缩放平移.全图.左右上下平移等等地图导航功能: Navigation图片目录如下: 调用函数: //显

【Android的从零单排开发日记】之入门篇(十四)——Button控件+自定义Button控件

    好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把Android这块放在一边了,滚去看PHP的后台框架了(人家只是一个Android实习生,不带这么玩的),学校那边老师布置了一个hibernate的项目,还说我给你们一个月时间,慢慢看,慢慢学习(结果就是在群上发了一大堆的hibernate的视频教程,还真的是慢慢看慢慢学习了,而且视频还是极老的,h

安卓编程之自定义字体控件导致应用闪退

这坑踩的是结结实实,近来做项目,需要用到自定义字体,一个项目中近十种字体,果断选择了使用自定义控件来实现. 可是,大功告成之后,在性能较差的手机上去运行时,反复切换页面,应用闪退了,log没有有效的信息给到,百思不得其解啊. 解决方案: 在自己封装的MyApplication中,将自定义的字体的Typeface这个对象全局化. 然后,在自定义控件中使用全局的字体对象. 到这里,这个问题基本解决. 总结如下: 当app界面跳转时没有完美运行自己写的动画效果,给人以卡顿的效果,那么就说明主线程中有耗

easyui-datagrid自定义分页控件样式

var p = $('#tbTaskList').datagrid('getPager'); $(p).pagination({ pageSize: 20,//每页显示的记录条数,默认为10 pageList: [20, 50, 100],//可以设置每页记录条数的列表 beforePageText: '第',//页数文本框前显示的汉字 afterPageText: '页 共 {pages} 页', displayMsg: '当前显示 {from} - {to} 条记录 共 {total} 条记

WPF自定义控件(二)の重写原生控件样式模板

开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么办呢?----自定义样式与模板. 一.样式 在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而不必分别设置每个按钮的风格.Style是作为一种资源被保存下来的. 看下面的例子: <Style x:Key="style1" T

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

手机开发webapp的同学一定遇到过这样问题,如何为丑极了的手机元素应用自定义的样式.首先,要弄清楚为什么要定义手机原生控件的样式,就需要看看手机的那些原生框样式的丑陋摸样: android: ios: 无奈的选择 看完了这些丑陋的界面元素,我们就可以理解当我们把他们暴露在产品同学的眼中时,那种层层的杀气了.可以看到,界面元素十分丑陋,产品兄弟是肯定不会接受的.但是,不得不说这些控件在触发后的效果比pc机上的要炫酷.这其中以apple机的滚筒选择最为出色.以下是它们触发后调用原生控件的效果: a

WPF管理系统自定义分页控件 - WPF特工队内部资料

原文:WPF管理系统自定义分页控件 - WPF特工队内部资料 最近做一个演示的管理系统项目,需要用到分页控件,在网上找了很多,依然找到与UI模版匹配的,最后干脆自己写一个. 分页控件分析: 1.分页控件分简单显示和复杂显示两种: 2.包含上一页.下一页以及页码明细逻辑处理: 3.页码总数小于7时显示默认显示,大于7时切换复杂显示: 4.页码数.索引.总条数计算等: 先来一张效果图: 啥也不说了直接上代码 MISPager.xaml部分 <ResourceDictionary xmlns="