【WP8】自定义控件
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】自定义控件的更多相关文章
- android自定义控件一站式入门
自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...
- ASP.NET MVC学习之母版页和自定义控件的使用
一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...
- C# 自定义控件VS用户控件
1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...
- 自定义控件之 圆形 / 圆角 ImageView
一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的: 二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...
- 如何开发FineReport的自定义控件?
FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论. 第一步:实例化一 ...
- WPF自定义控件第二 - 转盘按钮控件
继之前那个控件,又做了一个原理差不多的控件.这个控件主要模仿百度贴吧WP版帖子浏览界面左下角那个弹出的按钮盘.希望对大家有帮助. 这个控件和之前的也差不多,为了不让大家白看,文章最后发干货. 由于这个 ...
- 【Win 10应用开发】AdaptiveTrigger在自定义控件中是可以触发的
前些天,看到有网友给我留言,说AdaptiveTrigger在自定义控件(模板化控件)中不能触发.因为当时我正在写其他的代码,就没有去做实验来验证,于是我就给这位网友提了使用GotoVisualSta ...
- WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展
一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...
- Android自定义控件之自定义ViewGroup实现标签云
前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...
随机推荐
- Android线程通信
摘要 andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传 ...
- JAVA-JSP内置对象之response对象实现页面自动刷新
相关资料:<21天学通Java Web开发> response对象 实现页面自动刷新1.可以通过response对象的addIntHeader()方法添加一个标题为Refrsh的标头,并指 ...
- elasticsearch golang的sdk使用
文档第一 <elasticsearch权威指南>直接看官网在线版的,比较新,网上那些pdf版的,都是2.x版的,许多不兼容 官方API手册,可以选择版本. golang sdk库的选择 主 ...
- git拉取远程分支
查看本地所有分支列表: git branch -a 查看远程所有分支列表: git branch -r 拉取远程分支(使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checko ...
- mac OS X中升级php5.5至php5.6 or php7
在做php项目中,提示“Warning. PHP 5.6 or newer is required. Please, upgrade your local PHP installation.” 通过p ...
- Java 调用cmd.exe命令
原理:java的Runtime.getRuntime().exec(commandText)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是 ...
- Redis提供的持久化机制(二)
1.前言 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集 ...
- [转]Java中的POJO类
简单的Java对象(Plain Old Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter se ...
- drupal 不错的网址
1.最重要的7个Drupal内核模板文件 http://mydrupal.org/%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%847%E4%B8%AAdrupal%E5%86% ...
- spring security笔记
当指定http元素的auto-config=”true”时,就相当于如下内容的简写. <security:http> <security:form-login/> <se ...