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



 

原文地址:https://www.cnblogs.com/puncha/p/3877035.html