wpf编程之自定义button控件样式(代码片段)

qlzc qlzc     2023-01-20     401

关键词:

  自.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="imgdownload.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按钮的样式和模板定义就基本完成了。



wpf自定义button按钮控件

...不需要做大的改动。2.1普通按钮-扁平化风格先看效果:定义Button的样式,详见代码:?12345678910111213141 查看详情

wpf自定义控件の重写原生控件样式模板(代码片段)

原文:WPF自定义控件(二)の重写原生控件样式模板    话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式。  开发过程中,我们有时候用WPF原生的控件就能实现自己的... 查看详情

wpf自定义控件之带倒计时的按钮--button(代码片段)

原文:WPF自定义控件之带倒计时的按钮--Button1.说明  之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮 2.效果  1)正常状态   &... 查看详情

wpf自定义tabcontrol控件样式(代码片段)

...行关闭。要实现这些功能我们需要对TabControl的样式进行定义。二、实现TabControl的标题平均分布默认的TabControl标题是使用TabPanel容器包含的。要想实现Ta 查看详情

自定义swt控件一之自定义单选下拉框(代码片段)

一、自定义下拉控件 自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其它区域或选择完之后,独立window构成的下拉框会自动消失。packagecom.view.control.select;importjava.util.ArrayLi... 查看详情

[wpf自定义控件库]以button为例谈谈如何模仿aero2主题(代码片段)

1.为什么选择Aero2除了以外观为卖点的控件库,WPF的控件库都默认使用“素颜”的外观,然后再提供一些主题包。这样做的最大好处是可以和原生控件或其它控件库兼容,而且对于大部分人来说模仿原生的主题也比自己设计一套... 查看详情

wpf基础控件之togglebutton样式(代码片段)

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButtonToggleButton 实现下面的效果1)ToggleButton来实现动画ÿ 查看详情

wpf基础控件之slider样式(代码片段)

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButtonSlider 实现下面的效果1)Slider来实现动画&# 查看详情

wpf效果第二百零五篇之自定义导航控件

前面摸索了一下会简单玩耍自定义控件了;今天再次分享一下N年前想要在GIS实现的一个导航控件;来看看最终实现的效果:1、先来看看前台xaml布局:2、后台路由事件就参照上一篇快捷方式3、关键依赖属性的回调触发路由事件:4、内... 查看详情

[wpf自定义控件]从contentcontrol开始入门自定义控件(代码片段)

原文:[WPF自定义控件]从ContentControl开始入门自定义控件1.前言我去年写过一个在UWP自定义控件的系列博客,大部分的经验都可以用在WPF中(只有一点小区别)。这篇文章的目的是快速入门自定义控件的开发,所以尽量精简了篇幅... 查看详情

android自定义view之自定义组合控件(代码片段)

运行效果Android自定义组合控件之titleBarhttps://www.bilibili.com/video/BV17w411Z7pV/代码valuesattrs.xml<?xmlversion="1.0"encoding="utf-8"?><resources><declare-styleablename= 查看详情

wpf使用皮肤影响按钮自定义(代码片段)

在WPF项目中使用了Theme的皮肤后,发现自定义的按钮全部都是皮肤里面的样式,如下图:要自定义样式,只有不给按钮使用皮肤样式。如果想给某一个控件使用样式,在前端Xaml的控件中,设置一下属性即可:dx:ThemeManager.ThemeName="... 查看详情

2021-08-09wpf控件专题button控件详解(代码片段)

1.Button控件介绍Button—ContentControlContentBackground背景色/图片Foreground前景色文本字体大小2.具体案例<ButtonName="btnLogin"Content="登录"Foreground="Green"FontStretch="ExtraEx 查看详情

自定义swt控件五之自定义穿梭框(代码片段)

5、自定义穿梭框packagecom.view.control.shuttlebox;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importorg.eclipse.swt.SWT;importorg.ecli 查看详情

[wpf自定义控件库]使用windowchrome自定义ribbonwindow(代码片段)

原文:[WPF自定义控件库]使用WindowChrome自定义RibbonWindow1.为什么要自定义RibbonWindow自定义Window有可能是设计或功能上的要求,可以是非必要的,而自定义RibbonWindow则不一样:如果程序使用了自定义样式的Window,为了统一外观需要把R... 查看详情

wpf效果第二百零四篇之自定义更新控件

好久没有更新文章,今天抽空来分享一下最近玩耍的自定义控件;里面包含了自定义控件、依赖属性和路由事件;来看看最终实现的效果:1、先来看看前台Xaml布局和绑定:<StyleTargetType="x:TypeCores:UploadWithProgressControl"><Sett... 查看详情

wpf:只读依赖属性的介绍与实践(代码片段)

原文:WPF:只读依赖属性的介绍与实践在设计与开发WPF自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等。事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称“只读... 查看详情

自定义swt控件二之自定义多选下拉框(代码片段)

2、自定义下拉多选框packagecom.view.control.select;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.LinkedHashMap;importjava.util.List;importjava.util.Map;importorg.eclipse.swt.SWT;importorg.ec 查看详情