(一)创建默认控件模板

要求开发人员使用您的控件定义他们自己的控件模板是不合理的。自定义控件应具有默认的模板,提供默认模板后,人们仍可以使用其他模板,将其覆盖,但如果不要求提供模板,您的控件会更加吸引人。

(1)向控件项目添加名为 Generic.xaml 的文件。(是的,此文件必须命名为 Generic.xaml。大小写无关紧要,但文件名不能改变。)

(2)在 Generic.xaml 中定义样式,该样式使用属性 setter 将值分配给控件的 Template 属性.

Silverlight 运行时自动在控件程序集(Generic.xaml 作为数据源嵌入其中)中查找 Generic.xaml 并将样式应用到控件实例

这里以SimpleButtonDemo为例说明,自定义控件。

在 Generic.xaml 中添加代码如下

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  xmlns:custom="clr-namespace:SimpleButtonDemo;assembly=SimpleButtonDemo"><Style TargetType="custom:SimpleButton"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="custom:SimpleButton"><Grid x:Name="RootElement"><Rectangle x:Name="BodyElement" Width="200" Height="100"              Fill="Lavender" Stroke="Purple" RadiusX="16" RadiusY="16" /><TextBlock Text="Click Me" HorizontalAlignment="Center"              VerticalAlignment="Center" /></Grid></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>

在SimpleButton.cs 并将以下语句添加到类构造函数

this.DefaultStyleKey = typeof(SimpleButton);

(二)添加模板绑定TemplateBinding

以上有个问题,我们若用下面的代码改变控件宽度,高度,会有以下问题!,该控件仍然是上面Rectangle宽 200,高 100,因为这些值已硬编码到控件模板中。

<custom:SimpleButton Width="250" Height="150" />

(1)模板绑定TemplateBinding的好处

模板绑定:允许分配给控件的属性值向下传递到控件模板,并且是使用 {TemplateBinding} 标记扩展在 XAML 中声明的。

Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"

 (三)ContentPresenter

(1)从 ContentControl 派生的自定义控件意味着它具有 Content 属性,在这钟情况下,我们常常用ContentPresenter替换TextBlock。因为TextBlock 只能呈现文本,而 ContentPresenter 可以呈现分配给此控件的 Content 属性的任何 XAML。

(2)现在,SimpleButton 支持两个自定义级别。可以使用自定义模板重新定义其整个可视树,或者仅使用 Content 属性重新定义其内容。而且,您还可以使用简单的 Content 属性更改按钮文本。SimpleButton 的行为越来越接近真正的按钮控件。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  xmlns:custom="clr-namespace:SimpleButtonDemo;assembly=SimpleButtonDemo"><Style TargetType="custom:SimpleButton"><Setter Property="Width" Value="200" /><Setter Property="Height" Value="100" /><Setter Property="Background" Value="Lavender" /><Setter Property="FontSize" Value="11" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="custom:SimpleButton"><Grid x:Name="RootElement"><Rectangle x:Name="BodyElement"              Width="{TemplateBinding Width}"              Height="{TemplateBinding Height}"              Fill="{TemplateBinding Background}"              Stroke="Purple" RadiusX="16" RadiusY="16" /><ContentPresenter Content="{TemplateBinding Content}"              HorizontalAlignment="Center" VerticalAlignment="Center"              FontSize="{TemplateBinding FontSize}" /></Grid></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>

(四)添加 Click 事件

在 Siverlight 中,事件只能向上传递,即“冒泡”操作。路由事件由 RoutedEventHandler 委托定义,并且路由事件处理程序接收 RoutedEventArgs 对象,该对象包含用于确认引发此事件的对象的 Source 属性(如果此事件最初由可视树中的深层对象引发,则该属性不同于传递给事件处理程序的发送者参数)。内置 Button 控件的 Click 事件是一个路由事件,因此 SimpleButton 的 Click 事件也应该是路由事件。

public class SimpleButton : ContentControl{public event RoutedEventHandler Click;

public SimpleButton()    {this.DefaultStyleKey = typeof(SimpleButton);this.MouseLeftButtonUp += new MouseButtonEventHandler            (SimpleButton_MouseLeftButtonUp);    }

void SimpleButton_MouseLeftButtonUp(object sender,        MouseButtonEventArgs e)    {if (Click != null)            Click(this, new RoutedEventArgs());    }}

(五)添加可视状态

(1)Silverlight 控件的两个主要组件是可视状态和可视状态转换。可视状态用于定义控件在不同状态下的外观:在处于按下、鼠标点击、禁用等状态时的外观。可视状态转换用于定义控件如何从一种可视状态转换到另一种可视状态:例如,从“正常”状态转换到“按下”状态。
(2)视觉状态管理器 (VSM),您可以使用 VisualState 对象封装 Storyboards 以定义状态,使用 VisualTransition 对象定义转换。然后,您可以使用 VisualStateManager 类的静态 GoToState 方法将控件转换到指定的状态以响应用户操作。

参考链接:

为 Silverlight 2 创建自定义控件

让你的silverlight更炫(一):从自定义控件说起相关推荐

  1. 让你的silverlight更炫(三):让BusyIndicator更炫

    默认情况下BusyIndicator样式横向的波纹状,下面我们改变下BusyIndicator样式,让其更炫.我们可以在Blend中新建一个ResourceDictionary1.xaml文件,里面放 ...

  2. excel不能插入activex控件_办公小技巧:制作更炫酷的Excel下拉菜单

    在Excel中制作下拉菜单,大都是利用数据有效性,再有就是表单控件中的组合框.数据有效性或表单控件组合框制作下拉菜单,快捷.便利.实用.功能很全面,但也有力所不及的地方,比如设置下拉菜单的字体.颜色. ...

  3. Cocos游戏引擎3D特效全新升级 更流畅更炫酷

    好莱坞大片一度是各大院线叫座又叫好的劲爆卖点,其炫酷劲爽的影视特效是尤为重要的一个因素.对于手游来说,精细流畅而又动感十足的特效亦是如此.Cocos 2d-x 3.x从3.4 beta0版本开始开启了 ...

  4. 用 Python 给程序加个进度条,让你的程序看起来更炫酷

    你好,我是天作. 最近,我真的好丧.一些有截止日期的事情,都是拖到Deadline的前一天才草草了事:对于那些没有截至日期的事情,更是仅仅存在脑子里,徒增了焦虑,却迟迟没有动手. 不幸中的万幸,我渐渐 ...

  5. 【源码共享】我花2小时写了微信官网的响应式布局HTML+CSS 换成旅行主题风格更炫酷了

    微信官网仿写效果 ↑ 移动端响应式效果 ↑ 微信官网首页,简约干净,能学习写好这个首页,就能掌 握HTML网页设计前端盒子的布局.嵌套,及css效果的 使用... 微信官网首页主要有以下几个需要关注的 ...

  6. 还在用Navicat?这款开源的数据库管理工具界面更炫酷!

    数据库管理工具,是后端程序员使用频率非常高的的工具.Navicat.DataGrip虽然很好用,但都是收费的.最近在逛Github的时候,无意间发现了一款开源的数据库管理工具Beekeeper Stu ...

  7. 让你的网站更炫酷的一些小 tips

    本文讲的是让你的网站更炫酷的一些小 tips, 上周,我和一位老客户聊天,她说:"尼克,我觉得我的网站需要改进,但我不能确定我具体需要做什么." 然后我就去问了一圈,包括朋友.家人 ...

  8. 高端手机竞争加剧,苹果三星投资打造更炫手机

    据今日美国报道,在购买未来智能手机时,你需要抵押贷款吗?尽管这么说有点儿夸张,但随着新款iPhone 8有望在下月以超过1000美元的价格发售,我们不禁要问:什么样的人才买得起?事实上,苹果十周年纪念 ...

  9. 再见丑陋的 SwaggerUI,这款API文档生成神器界面更炫酷,逼格更高!

    欢迎关注方志朋的博客,回复"666"获面试宝典 一般在使用 Spring Boot 开发前后端分离项目的时候,都会用到 Swagger.Swagger 是一个规范和完整的框架,用于 ...

最新文章

  1. 检查邮箱是否包含教育后缀.edu结尾的邮箱
  2. 【MM模块】 Goods Receipt 收货 2
  3. android camera viewport rect,Unity 实现屏幕抖动效果(通过Camera Viewport Rect)
  4. python连接hive kerberos_数据库开发实战教程:使用Python连接Kerberos的Presto
  5. 《HTML与CSS入门经典(第8版)》——导读
  6. Neutron的Port详解
  7. dhcp服务器怎么设置虚拟网段,配置DHCP服务器不同网段分配ip
  8. 为何数据库也云原生了?
  9. 微信iBeaconID-微信官方iBeacon蓝牙基站UUID编码
  10. 安装apache出错
  11. Linux系统安装Anaconda3保姆级教程
  12. WPS无法加载EndNote加载项
  13. cv2.warpAffine 参数详解
  14. 老嘤学习笔记 python异常处理
  15. Python | 用Python制作送给女票的生日礼物
  16. 【实验3 循环结构】7-14 循环结构 —— 中国古代著名算题。趣味题目:物不知其数。
  17. 考研数学核心知识点总结
  18. “无人驾驶汽车”挑战现行法律 这些问题必须厘清!
  19. iphone4 5.0.1完美越狱教程(RedSn0w 0.9.10b3)[转]
  20. 电子商务代运营模式浅谈

热门文章

  1. LeetCode | 3 Sum
  2. [导入]Reporting Services 5: Extensions Custom Report Item
  3. The method getTextContent() is undefined for the type Node 错误解决办法
  4. Struts2之文件下载
  5. android n 支持机型,Android N无缝更新功能不适于现有机型
  6. Mysql排序添加名词_记面试中问到的MySQL的SQL调优问题
  7. 最大独立匹配_新车|升级柴油国六动力,配后排独立座椅,瑞风M5新车型上市...
  8. 比特币、以太坊、瑞波币、万融链和区块链
  9. 《解读NoSQL》——1.4 小结
  10. 主人公的出场—一个程序员的成长史(1)