CPF 入门教程 - 属性和事件(七)
CPF C#跨平台桌面UI框架
系列教程
CPF 入门教程 - 属性和事件(七)
依赖属性
CpfObject相当于WPF里的DependencyObject依赖对象。继承该类的对象,所有属性默认都是依赖属性
依赖属性有什么用?支持属性变化通知,数据绑定,触发器,动画等等。
属性写法:
/// <summary>
/// 绑定的数据上下文
/// </summary>
[PropertyMetadata(null)]
public virtual object DataContext
{
get { return GetValue<object>(); }
set { SetValue(value); }
} /// <summary>
/// 前景色
/// </summary>
[UIPropertyMetadata(typeof(ViewFill), "Black", UIPropertyOptions.AffectsRender)]
public ViewFill Foreground
{
get { return (ViewFill)GetValue(); }
set { SetValue(value); }
}
属性上的特性可以是 PropertyMetadata或者UIPropertyMetadata 中的一个,默认值建议通过这两个特性来设置。如果不加这两个特性,那默认值就是null或者0,属性不能是private,否则子类无法使用该属性,
子类不能用new的方式来覆盖属性
如果是复杂属性类型默认值,可以通过重写 OnOverrideMetadata 来设置
protected override void OnOverrideMetadata(OverrideMetadata overridePropertys)
{
base.OnOverrideMetadata(overridePropertys);
overridePropertys.Override("StrokeStyle", new UIPropertyMetadataAttribute(new Stroke(1)));
}
如果不希望声明为依赖属性,上面加[NotCpfProperty]
[NotCpfProperty]
public bool IsMeasureValid
{
get;
private set;
}
附加属性:
特殊的依赖属性,用来做特殊功能的标记
/// <summary>
/// 获取或设置元素行索引
/// </summary>
public static Attached<int> RowIndex
{
get { return CpfObject.RegisterAttached(0); }
} Grid.RowIndex(control, 1);//使用附加属性方式设置行索引 var index = Grid.RowIndex(control);//获取附加属性值 control.Attacheds.Add(Grid.ColumnIndex, 0);
//附加属性的设置和绑定
new Border
{
Attacheds={ { Grid.ColumnIndex, 0,nameof(TabStripPlacement),this}},
}
计算属性
计算属性来自Vue里的computed 可绑定,只读属性
当SelectValue或者TextSize属性值变化之后导致TestComputedProperty属性值变化,有提供属性通知
[Computed(nameof(SelectValue), nameof(TextSize))]
public string TestComputedProperty
{
get { return SelectValue == null ? "" : SelectValue.ToString() + TextSize; }
}
属性通知
如果是对象自己内部绑定,定义个方法,上面加个PropertyChanged(通知的属性名)就行,方法参数必须是
(object newValue, object oldValue, PropertyMetadataAttribute attribute)
PropertyChanged可以加多个,相当于绑定到多个属性通知事件
[PropertyChanged(nameof(MarginBottom))]
[PropertyChanged(nameof(MarginLeft))]
[PropertyChanged(nameof(MarginRight))]
[PropertyChanged(nameof(MarginTop))]
void RegisterMargin(object newValue, object oldValue, PropertyMetadataAttribute attribute)
{ }
一般不建议用重写 OnPropertyChanged的方式来处理属性变化事件
如果外部的话,绑定PropertyChanged事件,通过事件数据CPFPropertyChangedEventArgs来判断属性和获取属性数据
事件定义
CpfObejct里的事件定义,弱引用事件,并且不会被重复绑定
public event EventHandler<RoutedEventArgs> DoubleClick
{
add { AddHandler(value); }
remove { RemoveHandler(value); }
} RaiseEvent(e, nameof(DoubleClick));//触发事件
由于是弱引用的,所以不能采用Lambda方式来绑定事件,因为可能会被回收导致绑定失效
比如这种写法this.Click+=(s,e)=>{…};
CPF 入门教程 - 属性和事件(七)的更多相关文章
- CPF 入门教程 - 各个控件介绍(八)
CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...
- CPF 入门教程 - 各平台各系统发布说明(九)
CPF C#跨平台桌面UI框架,支持Windows,Mac,Linux,支持龙芯.飞腾等CPU 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - ...
- CPF 入门教程 - 数据绑定和命令绑定(二)
CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) 数据绑定和Wpf类似,支持双向绑定.数据绑定和命令绑定是UI和业务逻辑分离的基础 ...
- CPF 入门教程 - 设计器和模板库的使用(五)
CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF ...
- Caliburn.Micro 杰的入门教程4,事件聚合器
Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(原创翻译)Caliburn.Micro 杰的入门 ...
- Caliburn.Micro 杰的入门教程3,事件和参数
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- CPF 入门教程 - 样式和动画(三)
CPF NetCore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) 用样式可以对内部元素进行批量设置属性. ...
- CPF 入门教程 - 绘图(四)
CPF NetCore跨平台UI框架,增加了Vlc支持跨平台播放视频. 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF ...
- CPF 入门教程 - 控件布局(六)
CPF netcore跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) C ...
随机推荐
- ADT基础(三)—— HashMap
ADT基础(三)-- HashMap 1 哈希表 哈希表(hash table),也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维 ...
- wxWidgets源码分析(5) - 窗口管理
窗口管理 所有的窗口均继承自wxTopLevelWindows: WXDLLIMPEXP_DATA_CORE(wxWindowList) wxTopLevelWindows; wxTopLevelWi ...
- 你不知道的Scheduled定时任务骚操作
目录 一.什么是定时任务 二.项目依赖 三.注解式定时任务 3.1 cron 3.2 fixedDelay 3.3 fixedDelayString 3.4 fixedRate 3.5 fixedRa ...
- 微信小程序弹出框滚动穿透问题
1.在你的遮罩层最外层加 catchtouchmove="noneEnoughPeople" 里面是你的方法名2.noneEnoughPeople: function () { c ...
- 【免费开源】基于Vue和Quasar的crudapi前端SPA项目实战—环境搭建 (一)
背景介绍和环境搭建 背景 crudapi增删改查接口系统的后台Java API服务已经全部可用,需要一套后台管理UI,主要用户为开发人员或者对计算机有一定了解的工作人员,通过UI配置元数据和处理业务数 ...
- LNMP配置——Nginx配置 ——Nginx防盗链
一.配置 #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test ...
- Shell:如何写一个多选菜单的脚本
Blog:博客园 个人 翻译自How to Create a Multiple Choice Menu in Bash Scripts 目录 多选菜单脚本介绍 配置输入提示 创建预定选项列表 创建预选 ...
- mybatis&plus系列------Mysql的JSON字段的读取和转换
mybatis&plus系列------Mysql的JSON字段的读取和转换 一. 背景 在平常的开发中,我们可能会有这样的需求: 业务数据在存储的时候,并不是以mysql中的varchar丶 ...
- mysql最经典的语句
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...
- 如何获取占用U盘的进程
依次打开开始---所有程序---附件---系统工具---资源监视器. 打开CPU标签栏,在"关联的句柄"中的搜索框中输入U盘的盘符,如G: 按回车搜索即可出结果. 在搜索结果中右键 ...