【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自定义控件之自定义组合控件(三),常言 ...
随机推荐
- 纯css3开发的响应式设计动画菜单(支持ie8)
这是一个响应式设计的菜单.单击列表图标,当你显示屏大小可以完全水平放下所有菜单项时,菜单水平显示(如图1).当你的显示屏不能水平放置所有菜单项时,菜单垂直显示(如图2). 而且显示的时候是以动画的型式 ...
- MAMP和WAMP搭建Web环境,数据库,数据分布可视化
MAMP和WAMP搭建Web环境,数据库,数据分布可视化 1. 数据库 用MAMP和WAMP搭建Web环境,数据分布可视化 Web环境Web服务器:Apache.Nginx,处理Web请求数据库:My ...
- [转]SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...
- [Java程序员面试宝典]读书笔记
ClassLoader具备层次关系,且不止一种.不同的类装载器分布创建的同一个类的字节码数据属于完全不同的对象,没有任何关联 通过Class.forName(String className),能够动 ...
- STM32f103的数电采集电路的TIMER定时器的使用与时序控制的程序
STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成.STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较 ...
- Android——关于PagerAdapter的使用方法的总结(转)
PagerAdapter简介 PagerAdapter是android.support.v4包中的类,它的子类有FragmentPagerAdapter, FragmentStatePagerAdap ...
- 聊聊Java中的拆箱和装箱操作
在刷谷歌面试题的过程中,发现一道有意思的题目,以前没有特别注意,忽略了一些东西,特此记录. 题目要求输出以下代码的结果: public class MyTest { public static voi ...
- JDBC setCatalog
数据库URL:jdbc:mysql://localhost:3306/{catalog} catalog指代数据库名称. 1如果该参数不存在,则必须使用setCatalog设置数据库名称,否则会抛出 ...
- Sword redis数据结构
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) string 是 redi ...
- Union和Union All的区别[转]
来源:http://blog.csdn.net/wanghai__/article/details/4712555/ 假设我们有一个表Student,包括以下字段与数据: drop table stu ...