1、测量和安排布局:MeasureOverride, ArrangeOverride

  

    //测量(传入控件的可用大小)
protected override Size MeasureOverride(Size availableSize)
{
//遍历所有子空间
foreach (UIElement child in InternalChildren)
{
//计算控件可用大小,调用子控件的MeasureOverride方法
child.Measure(availableSize);
//获得控件大小
//child.DesiredSize
} //返回给ArrangeOverride调用
return availableSize;
} //安排布局
protected override Size ArrangeOverride(Size finalSize)
{
double x = ;
foreach (UIElement child in InternalChildren)
{
//安排控件实际渲染位置,通过 DesiredSize获得控件需要的大小
child.Arrange(new Rect(new Point(x, ), child.DesiredSize));
x += child.DesiredSize.Width;
}
//返回控件实际布局大小(在父控件通过DesiredSize获得)
return finalSize;
}

2、依赖属性

//注册依赖属性
public static DependencyProperty TextProperty = DependencyProperty.Register("MyText",
typeof(string),
typeof(MySilverButton),
new PropertyMetadata("默认属性值", OnTextPropertyChanged)); //依赖属性对应的控件属性
public string MyText
{
get { return (string) GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
} //依赖属性回掉函数(static)
private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//这里MySilverButton是控件类名
var mySilverButton = d as MySilverButton;
if (mySilverButton!=null)
mySilverButton.OnTextPropertyChanged(e);
} //属性变化回掉(通过静态函数调用,也可以在静态函数里写)
private void OnTextPropertyChanged(DependencyPropertyChangedEventArgs e)
{
var bgTextBlock = GetTemplateChild("ButtonCaption") as TextBlock;
if (bgTextBlock != null) bgTextBlock.Text = e.NewValue as string;
}

  在xaml中定义Template时,可以通过{TemplateBinding MyText}绑定依赖属性

3、在模板加载完成后注册事件和一些初始化操作
  public override void OnApplyTemplate()

4、获取子控件和资源(定义在Generic.xaml)

    //获取根控件
var root = (FrameworkElement)GetTemplateChild("RootElement");
//获取控件资源
var enter = (Storyboard)root.Resources[MouseEnterAnimation];

5、元数据

  在控件的定义加上TemplatePart特性,该特性不是必须的,只是一种契约,推荐这样设计控件

  意思是告诉要来写ControlTemplate的用户,你的ControlTemplate中需要有一个x:Name为“LayoutRoot” , 类型为 Panel 的元素 , 因为逻辑部分对这些东西进行了引用,它们将对控件的默认行为起着关键作用, 可以理解为这个控件的最基本元素,是实现默认行为的最小集合,主要是给用户看的

    [TemplatePart(Name = "LayoutRoot", Type = typeof (Panel))]
[TemplateVisualState(GroupName = "HoverStates", Name = "MouseOver")]
[TemplateVisualState(GroupName = "HoverStates", Name = "Normal")]
public class MyControl : Control

6、视图状态

//一般在ControlTemplate中的Border控件内部定义

    <VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="HoverStates">
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimation
Storyboard.TargetName="BackgroundElement"
Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)"
To="Yellow" Duration="0:0:.5" />
</Storyboard>
</VisualState>
<VisualState x:Name="Normal">
<Storyboard>
<ColorAnimation
Storyboard.TargetName="BackgroundElement"
Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)"
To="Transparent" Duration="0:0:.5" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>

  //在视图中定义不同视图状态的过度动画逻辑

  在cs中改变视图状态(this表示该控件)
  VisualStateManager.GoToState(this, "MouseOver", useTransitions);

参考链接
1、WPF MeasureOverride And ArrangeOverride
  http://www.cnblogs.com/dingli/archive/2011/04/22/2024786.html
2、用户自定义控件详解
  http://blog.csdn.net/mr_raptor/article/details/7251942

【WP8】自定义控件的更多相关文章

  1. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

  2. ASP.NET MVC学习之母版页和自定义控件的使用

    一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...

  3. C# 自定义控件VS用户控件

    1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...

  4. 自定义控件之 圆形 / 圆角 ImageView

    一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的:       二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...

  5. 如何开发FineReport的自定义控件?

    FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论. 第一步:实例化一 ...

  6. WPF自定义控件第二 - 转盘按钮控件

    继之前那个控件,又做了一个原理差不多的控件.这个控件主要模仿百度贴吧WP版帖子浏览界面左下角那个弹出的按钮盘.希望对大家有帮助. 这个控件和之前的也差不多,为了不让大家白看,文章最后发干货. 由于这个 ...

  7. 【Win 10应用开发】AdaptiveTrigger在自定义控件中是可以触发的

    前些天,看到有网友给我留言,说AdaptiveTrigger在自定义控件(模板化控件)中不能触发.因为当时我正在写其他的代码,就没有去做实验来验证,于是我就给这位网友提了使用GotoVisualSta ...

  8. WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...

  9. Android自定义控件之自定义ViewGroup实现标签云

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...

随机推荐

  1. win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 异常 解决办法

    win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 错误 解决方法改注册表.这个就是DB03.EXE引起的. cmd打开注册表:regedit找到注册表"HKE ...

  2. Wireshark抓包工具HttpAnalyzerStdV7

    http.request.full_uri contains "XXXserver/api/" http.host contains "XXX5.单位.com"

  3. Node.js学习笔记(1)--一个最简单的服务器请求

    说明(2017-5-2 10:27:03): 1. 需要安装node,http://nodejs.cn/download/ 2. 安装完后,在cmd里输入node -v可以查看版本. 3. 代码foo ...

  4. js生成验证码并且验证

    <html> <head> <title>验证码</title> <style type="text/css"> #co ...

  5. centOSmini安装教程

    最近使用了CentOS发现比Ubuntu更简洁,有些爱上CentOS了 1. 准备一版CentOS安装镜像文件 官网下载地址:http://www.centos.org/download/ 官方有三个 ...

  6. RPC框架与分布式服务框架的区别

    第一:RPC框架是点对点的通信方式,即服务消费者与服务提供者是点对点通信 第二:分布式服务框架,不近具有RPC框架的特性,同时,还包括以下特性: 1.提供多台服务器提供服务,具有负载均衡策略 2.服务 ...

  7. JVM相关命题的博客整理及总结

    JVM垃圾回收基础介绍 http://www.jianshu.com/p/57457a351b8a 减少JVM中逃逸对象的使用 http://www.importnew.com/23150.html ...

  8. Android——黑名单管理

    DBHelper.java package com.example.chenshuai.test; import android.content.Context; import android.dat ...

  9. Vagrant (3) —— 复制/备份Vagrant Box

    Vagrant (3) -- 复制/备份Vagrant Box 摘要 介绍复制/备份Vagrant Box基本方法 版本 Vagrant版本: 1.8.1 内容 复制vagrant box并压缩 关闭 ...

  10. [转载]番茄时间管理法(Pomodoro Technique):一个番茄是如何让你工作更有效率的

    如果你经常读一些关于提高工作效率或时间管理类的博客,一定听说过番茄时间管理法(Pomodoro Technique).这是一种极好的帮助你集中注意力.获得更高工作效率的方法. 基本上,它的实施方法是这 ...