CPF C#跨平台桌面UI框架

系列教程

CPF 入门教程(一)

CPF 门教程 - 数据绑定和命令绑定(二)

CPF 入门教程 - 样式和动画(三)

CPF 入门教程 - 绘图(四)

CPF 入门教程 - 设计器和模板库的使用(五)

CPF 入门教程 - 控件布局(六)

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 入门教程 - 属性和事件(七)的更多相关文章

  1. CPF 入门教程 - 各个控件介绍(八)

    CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...

  2. CPF 入门教程 - 各平台各系统发布说明(九)

    CPF C#跨平台桌面UI框架,支持Windows,Mac,Linux,支持龙芯.飞腾等CPU 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - ...

  3. CPF 入门教程 - 数据绑定和命令绑定(二)

    CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) 数据绑定和Wpf类似,支持双向绑定.数据绑定和命令绑定是UI和业务逻辑分离的基础 ...

  4. CPF 入门教程 - 设计器和模板库的使用(五)

    CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF ...

  5. Caliburn.Micro 杰的入门教程4,事件聚合器

    Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(原创翻译)Caliburn.Micro 杰的入门 ...

  6. Caliburn.Micro 杰的入门教程3,事件和参数

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  7. CPF 入门教程 - 样式和动画(三)

    CPF NetCore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) 用样式可以对内部元素进行批量设置属性. ...

  8. CPF 入门教程 - 绘图(四)

    CPF NetCore跨平台UI框架,增加了Vlc支持跨平台播放视频. 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF ...

  9. CPF 入门教程 - 控件布局(六)

    CPF netcore跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) C ...

随机推荐

  1. docker启动ubuntu的桌面环境

    一.概述 由于最近一段时间在家办公,国内服务器在阿里云,国外站点在aws.家里的移动宽带比较差,无法访问aws. 所以尝试在阿里云启动docker,找到一个lxde桌面环境的ubuntu镜像. 二.启 ...

  2. 后端程序员之路 43、Redis list

    Redis数据类型之LIST类型 - Web程序猿 - 博客频道 - CSDN.NEThttp://blog.csdn.net/thinkercode/article/details/46565051 ...

  3. Dos常用命令整理

    Dos常用命令整理 打开cmd的方法 开始菜单 -> 系统 -> 命令提示符 组合键Win+R打开运行 -> 输入cmd 在任意文件夹下Shift+鼠标右键 -> 在此处打开命 ...

  4. 测试成长记录:python调adb无法获取设备信息bug记录

    背景介绍: 一直在负责公司Android自动化的编写工作,采用的是uiautomator2,需要获取设备id来连接设备,就是 adb devices 问题描述: 之前一直用 subprocess.ch ...

  5. Ubuntu的点滴-Vim、VM Tools、Samba、换源

    <div id="article_content" class="article_content clearfix"> <link rel=& ...

  6. 2.2 Python3基础-基本数据类型

    >>返回主目录 源代码 # 基本数据类型 # Number类型:如何查看变量的数据类型? name = 'Portos' print(type(name)) # 结果:str print( ...

  7. Python中OS对目录的操作以及引用

    路径的获取 对当前目录的获取 1 path = os.getcwd() 2 print("获取到的当前目录是:({})".format(path)) 获取当前文件所在的绝对路径 i ...

  8. JAVA中枚举Enum详解

    1.关键字:enum.枚举可以定义成单独的文件,也可以定义在其他类内部. 枚举在类内部的示例: public class EnumInner { public static void main(Str ...

  9. vscode配置golang开发环境手把手描述篇

    1.下载安装Golang https://golang.google.cn/dl/ 一路下一步即可 2.下载安装Vscode https://visualstudio.microsoft.com/zh ...

  10. Springboot的监控

    目录 Micrometer 计数器 仪表 摘要 计时器 Prometheus grafana 保存后我们就能在dashboard上看得我我们的监控指标了参考 Spring Boot有个子项目Sprin ...