PunCha

导航

统计

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); }
        }
    }



 

 

posted on   PunCha  阅读(218)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 因为Apifox不支持离线,我果断选择了Apipost!
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示