上一篇文章中谈到了BulletDecorator控件,就是为自定义CheckBox控件的模板做准备,因为CheckBox需要比较严格的布局,正好,BulletDecorator控件就合适了,该控件的布局是有项目列表,排列起来好办很多了。
 
第一步,先建立一项资源,就是控件的聚焦样式,即当你在窗体中不断按Tab键使控件获取焦点时的样式,后面要用到。
  1. <!--当控件获得键盘焦点时的样式-->
  2. <Style x:Key="FocusStyle">
  3. <Setter Property="Control.Template">
  4. <Setter.Value>
  5. <ControlTemplate>
  6. <Rectangle Stroke="Red" StrokeThickness="1"/>
  7. </ControlTemplate>
  8. </Setter.Value>
  9. </Setter>
  10. </Style>
 

第二步,写好CheckBox的样式。

  1. <!--
  2. CheckBox的样式
  3. -->
  4. <Style TargetType="{x:Type CheckBox}">
  5. <Setter Property="OverridesDefaultStyle" Value="True"/>
  6. <Setter Property="FocusVisualStyle" Value="{StaticResource FocusStyle}"/>
  7. <Setter Property="SnapsToDevicePixels" Value="True"/>
  8. <Setter Property="Foreground" Value="White"/>
  9. <Setter Property="FontSize" Value="16"/>
  10. <Setter Property="Template">
  11. <Setter.Value>
  12. <ControlTemplate TargetType="{x:Type CheckBox}">
  13. <BulletDecorator FlowDirection="LeftToRight" VerticalAlignment="Center">
  14. <BulletDecorator.Bullet>
  15. <Border x:Name="bd"
  16. BorderThickness="1"
  17. BorderBrush="Red"
  18. MinHeight="15"
  19. MinWidth="15"
  20. VerticalAlignment="Center">
  21. <Border.Background>
  22. <LinearGradientBrush StartPoint="0,0"
  23. EndPoint="1,1">
  24. <GradientStop Color="LightGray" Offset="0.2"/>
  25. <GradientStop Color="White" Offset="1"/>
  26. </LinearGradientBrush>
  27. </Border.Background>
  28. <Path x:Name="cp" Width="12" Height="12"
  29. Stroke="Blue"
  30. StrokeThickness="3"/>
  31. </Border>
  32. </BulletDecorator.Bullet>
  33. <ContentPresenter Margin="2,0"/>
  34. </BulletDecorator>
  35. <!--
  36. 控件触发器
  37. -->
  38. <ControlTemplate.Triggers>
  39. <Trigger Property="IsChecked" Value="True">
  40. <!-- 画上一个勾 -->
  41. <Setter TargetName="cp" Property="Data"
  42. Value="M 0,6 L 6,12 12,0"/>
  43. <Setter Property="Foreground" Value="LightGreen"/>
  44. </Trigger>
  45. <Trigger Property="IsMouseOver" Value="True">
  46. <Setter TargetName="bd" Property="Background">
  47. <Setter.Value>
  48. <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
  49. <GradientStop Color="Orange" Offset="0.12"/>
  50. <GradientStop Color="Yellow" Offset="0.92"/>
  51. </LinearGradientBrush>
  52. </Setter.Value>
  53. </Setter>
  54. </Trigger>
  55. </ControlTemplate.Triggers>
  56. </ControlTemplate>
  57. </Setter.Value>
  58. </Setter>
  59. </Style>
第三步,把窗体默认的Grid控件去掉,为了更好地布局,应使用StatcPanel控件。
  1. <StackPanel Orientation="Vertical" Margin="20,20,20,20">
  2. <CheckBox Content="苹果"/>
  3. <CheckBox Content="鸡蛋"/>
  4. <CheckBox Content="白菜"/>
  5. <CheckBox Content="萝卜"/>
  6. <CheckBox Content="豆浆"/>
  7. <CheckBox Content="咸菜"/>
  8. <CheckBox Content="炒饭"/>
  9. <CheckBox Content="烧鸭饭"/>
  10. <CheckBox Content="叉烧饭"/>
  11. </StackPanel>
好,完事,现在来看看效果吧。

当项目被选中后,字体自动变为绿色,请参照上面的XAML代码。

怎么样,漂亮不?

继续聊WPF——自定义CheckBox控件外观的更多相关文章

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

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

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

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

  3. WPF 自定义Button控件及样式

    这次通过最近做的小例子说明一下自定义Button控件和样式. 实现的效果为:

  4. IOS开发自定义CheckBox控件

    IOS本身没有系统的CheckBox组件,但是实际开发中会经常用到,所以专门写了一个CheckBox控件,直接上代码 效果图: UICheckBoxButton.h文件如下: #import #imp ...

  5. WPF 自定义UI控件学习

    最近项目中运用到了WPF处理三维软件,在C/S结构中WPF做UI还是有很多优越性,简单的学了一点WPF知识,成功的完成项目目标.项目过度阶段对于WPF的一些基本特点有了进一步了解 .至此花费一点时间研 ...

  6. wpf 自定义RadioButton控件样式

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

  7. WPF 自定义TabControl控件样式

    一.前言 程序中经常会用到TabControl控件,默认的控件样式很普通.而且样式或功能不一定符合我们的要求.比如:我们需要TabControl的标题能够居中.或平均分布:或者我们希望TabContr ...

  8. WPF自定义用户控件不显示

    1,Themes\Generic.xaml最好不要更名 "Generic.xaml"这个名称并非偶然通过上面的叙述,你可能会有冲动将Generic.xaml中的Style代码剪切出 ...

  9. WPF自定义动画控件 风机

      一:创建WPF项目 二:在项目下添加文件Themes,在此文件下添加新项 ”资源词典“取名为 Generic.xaml  注意大小写,之前遇到因为大小写不对应,导致出错的情况Generic.xam ...

随机推荐

  1. Erlang下与其他程序和语言的通信机制(1)

    在Erlang运行时中,提供了几种机制来实现与其它程序或者语言的通信.一种为分布式Erlang,一种为端口,其中端口分为普通端口和链入式驱动端口,还有后面引入的NIFs. 分布式Erlang:一个Er ...

  2. 【Java并发编程实战】—– AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形. 其主要从双方面进行了改造:节点的结构与节点等待机制.在结构上引入了 ...

  3. 【Linux】Linux下配置apache

    一.获取软件: http://httpd.apache.org/   httpd-2.4.10.tar.gz 二.安装步骤: 解压源文件: 1) tar zvxf  httpd-2.4.10.tar. ...

  4. 73. 解决ExtJS TreePanel 的 iconCls设置问题

    转自:https://blog.csdn.net/hanchuang213/article/details/62881568 很久没有写代码了,最近在做一个在线帮助网站,于是又捡起了 ExtJS,我用 ...

  5. 97. ExtJS之EditorGridPanel afteredit属性

    转自:https://zccst.iteye.com/blog/1328869 1. 之前大多用Ext.grid.GridPanel,现在需要可编辑功能,发现比以前稍复杂一些. 就是需要对指定列进行可 ...

  6. php文件,文件夹

    例子代码:<?php$f='/www/htdocs/index.html';$path_parts = pathinfo($f);echo $path_parts['dirname'], &qu ...

  7. codevs1358棋盘游戏(状压dp)

    1358 棋盘游戏  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master     题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初 ...

  8. A - Petya and Strings

    Problem description Little Petya loves presents. His mum bought him two strings of the same size for ...

  9. js动态追加的元素如何触发事件

    一般通过js或者jQuery动态添加的元素标签,通过该元素标签.class.id触发事件,是无效的.如下所示: <body> <input type="text" ...

  10. nginx单机1w并发设置

    关闭keep-live,提高链接回收 keeplive_timeout 0; events{ worker_connections 1024; } more /proc/sys/net/core/so ...