FrameworkPropertyMetadataOptions.Inherits 属性沿袭
今天研究了下属性的沿袭(DependencyProperty Inherit),研究之后和原来想象的有些出入:
假如我有一个自定义的Button, ClickedButton继承自Button控件,又增加了一个DependencyProperty(设计成可继承的), IsClicked。在XAML里面,假如我把Button的Content设置成TextBlock的话,按照以前的想法,TextBlock会有ClickedButton.IsClicked的属性,而实际情况是没有!
所以总结下来,假如你增加了一个新的DP,这个DP就算设置成可沿袭的,默认的控件依然不会自动沿袭这个属性。只有一种情况,可以让你的DP被沿袭,那就是在其他DependencyObject里面也实现这个DP,而且用AddOwner进行注册!(代码在文章最后会有)。同时需要注意的是,假如你的DP的MetaData没有“可沿袭”的属性,那么不管你是其他控件的儿子或者是父亲,你DP的属性也不会得到或者被沿袭。
4/17日更新:假如父类对某一个DP进行了AddOwner的操作,那么子类也会继承这个DP。
public class ClickButton : Button { public static readonly DependencyProperty IsClickedProperty = DependencyProperty.Register("IsClicked", typeof(bool), typeof(ClickButton), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsRender, null, null, false, UpdateSourceTrigger.PropertyChanged)); public bool IsClicked { set { SetValue(IsClickedProperty, value); } get { return (bool)GetValue(IsClickedProperty); } } protected override void OnClick() { IsClicked = !IsClicked; base.OnClick(); } } public class ClickButton2 : Button { public static readonly DependencyProperty IsClickedProperty; static ClickButton2() { IsClickedProperty = ClickButton.IsClickedProperty.AddOwner(typeof(ClickButton2)); FrameworkPropertyMetadata meta = new FrameworkPropertyMetadata(); meta.Inherits = true; IsClickedProperty.OverrideMetadata(typeof(ClickButton2), meta); } protected override void OnClick() { IsClicked = !IsClicked; base.OnClick(); } public bool IsClicked { set { SetValue(IsClickedProperty, value); } get { return (bool)GetValue(IsClickedProperty); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 因为Apifox不支持离线,我果断选择了Apipost!
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端