【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自定义控件之自定义组合控件(三),常言 ...
随机推荐
- [转]mysql的full join的实现
原文地址:https://blog.csdn.net/qq_1017097573/article/details/52638360 数据库多表查询主要有以下几种 inner join内连接查询,只有两 ...
- 让PHP7达到最高性能的几个Tips(转)
PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升, 然而, 为了让它能发挥出最大的性能, 我还是有几件事想提醒下. PHP7 ...
- TCP粘包, UDP丢包, nagle算法
一.TCP粘包 1. 什么时候考虑粘包 如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题(因为只有一种包结构,类似于http协议,UDP不会出 ...
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
引自:http://blog.csdn.net/sinat_26917383/article/details/72861152 中文文档:http://keras-cn.readthedocs.io/ ...
- 图像颜色--opencv scalar
Scalar定义可存放1—4个数值的数值,其结构体如下: typedef struct Scalar { double val[4]; }Scalar; 例如:Scalar s: 如果使用的图像是1通 ...
- win7系统损坏无法进入系统(dsark.sys文件损坏)(未测试过)
原文:http://blog.csdn.net/foreverhuylee/article/details/37913837 电脑今天突然开不了机,出现一下画面 即提示d:\Windows\syste ...
- 编写.info文件
概述 drupal用.info文件来存储主题和模块的metadata. 对于模块来说,.info文件用于: 为Drupal站点管理界面解析信息: 为模块的激活和卸载提供标准和需求: 提醒drupal一 ...
- android开发(28) 做个 指南针 应用
参考网上的资料,做了个指南针应用玩玩. 步骤: 1.获得 SensorManager. mSensorManager = (SensorManager) getSystemService(SENSOR ...
- ie6幽灵文字及解决办法
<!-- ie6 幽灵文字示例 --> <div style="width: 400px;"> <div style="float: lef ...
- Jna & twain
参考海康威视Java版示例(采用Jna实现) 获得win32原生窗口句柄:HWND hwnd = new HWND(Native.getComponentPointer(panelRealplay)) ...