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 加持,快人一步