【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自定义控件之自定义组合控件(三),常言 ...
随机推荐
- Oracle 项目中 SQL 脚本更新方式
DECLARE hasVersion ); dbVersion ); BEGIN ) INTO hasVersion FROM ELB_SETTINGS E WHERE E.KEY='dbVersio ...
- JAVA 生成无重复8位随机码(转)
转载自:https://my.oschina.net/vvcumt/blog/491504 短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个. 本 ...
- Android命令行截屏screencap
Android下面使用命令行截图. 因为工作调试用的机器,没法连接USB,所以用不了一般的截图方法,后来查了一下,Android4.0以后都内置了截图命令. 可以使用下面命令截取屏幕. screenc ...
- regsvr32.exe是什么东西
Regsvr32命令修复系统故障实例使用过activex的人都知道,activex不注册是不能够被系统识别和使用的,一般安装程序都会自动地把它所使用的activex控件注册,但如果你拿到的一个控件需要 ...
- Linux下高并发socket最大连接数所受的各种限制(转)
1.修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个 ...
- Java中ArrayList实现原理
简述: ArrayList可以理解为动态数组,与Java中的数组相比,它的容量能动态增长.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组中,因此最好能给出数组大小的预 ...
- Linux 使用tty0 显示10分钟自动关闭功能
如果用屏幕显示控制台,10分钟左右会自动关闭,有如下方法可以解决 在应用层调用如下代码: #include <fcntl.h> #include <stdio.h> #incl ...
- [net]netcat 做网络端口监听
nc命令说明:https://www.cnblogs.com/nmap/p/6148306.html 如下: nc -vz -w domain/ip &> /dev/null & ...
- MVC教程九:异常过滤器
我们平常在程序里面为了捕获异常,会加上try-catch-finally代码,但是这样会使得程序代码看起来很庞大,在MVC中我们可以使用异常过滤器来捕获程序中的异常,如下图所示: 使用了异常过滤器以后 ...
- 将windows控制台内容输出到文件中
将windows控制台内容输出到文件中 dir>c:/file.txt 2>&1 对应的java class >c:/file.txt 2>&1 ...