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)=>{…};

最新文章

  1. 异步IO比同步阻塞IO性能更好吗?为什么?
  2. php array_udiff_uassoc比较数组的键值与值
  3. C语言动态存储分配
  4. paper 84:机器学习算法--随机森林
  5. C#学习笔记之线程 - 同步上下文
  6. 常用的python模块
  7. (转)Android 判断用户2G/3G/4G移动数据网络
  8. xen虚拟机安装实践
  9. Windows RPC
  10. Android软件盘InputMethodManager
  11. .NET并行处理和并发1-Threads and Theading
  12. PHP date()函数格式与用法汇总
  13. 理解SSL/TLS协议
  14. TensorRT&amp;Sample&amp;Python[end_to_end_tensorflow_mnist]
  15. Kali 开启 SSH 服务方法
  16. 2018-2019 20175232 实验二《Java面向对象程序设计》实验报告
  17. Unnamed namespaces
  18. django自定义Admin actions
  19. flask你一定要知道的上下文管理机制
  20. HDU 5738 Eureka 统计共线的子集个数

热门文章

  1. 178. 分数排名 + MySql + RANK() OVER
  2. 聊聊IT技术人的知识体系
  3. mysql内一些可以延时注入的查询语句
  4. 漏洞复现-CVE-2014-3120-ElasticSearch 命令执行漏洞
  5. groovy-map.each{}
  6. 谈谈注册中心 zookeeper 和 eureka中的CP和 AP
  7. YoloV3 记录
  8. 开源项目renren-fast开发环境部署(后端部分)
  9. 上万字详解Spark Core(建议收藏)
  10. 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件