从基类的元数据复制元数据绝对是要走的路。尽管不幸的是,FrameworkPropertyMetadata
该类并没有像给出的那样公开标志,但它们作为bool
属性公开以指示它们的状态。要将这些值作为 a 返回FrameworkPropertyMetadataOptions
,您必须遍历关联的属性并将它们作为一个读回。
static DerivedClass()
{
var oldMeta = (FrameworkPropertyMetadata)BaseClass.SomeProperty.GetMetadata(typeof(BaseClass));
var flags = GetFlags(oldMeta);
// change the values as needed
var meta = new FrameworkPropertyMetadata(
oldMeta.DefaultValue,
flags,
oldMeta.PropertyChangedCallback,
oldMeta.CoerceValueCallback,
oldMeta.IsAnimationProhibited,
oldMeta.DefaultUpdateSourceTrigger
);
BaseClass.SomeProperty.OverrideMetadata(typeof(DerivedClass), meta);
}
static FrameworkPropertyMetadataOptions GetFlags(FrameworkPropertyMetadata metadata)
{
FrameworkPropertyMetadataOptions flags = FrameworkPropertyMetadataOptions.None;
if (metadata.AffectsArrange)
flags |= FrameworkPropertyMetadataOptions.AffectsArrange;
if (metadata.AffectsMeasure)
flags |= FrameworkPropertyMetadataOptions.AffectsMeasure;
if (metadata.AffectsParentArrange)
flags |= FrameworkPropertyMetadataOptions.AffectsParentArrange;
if (metadata.AffectsParentMeasure)
flags |= FrameworkPropertyMetadataOptions.AffectsParentMeasure;
if (metadata.AffectsRender)
flags |= FrameworkPropertyMetadataOptions.AffectsRender;
if (metadata.BindsTwoWayByDefault)
flags |= FrameworkPropertyMetadataOptions.BindsTwoWayByDefault;
if (metadata.Inherits)
flags |= FrameworkPropertyMetadataOptions.Inherits;
if (metadata.Journal)
flags |= FrameworkPropertyMetadataOptions.Journal;
if (metadata.IsNotDataBindable)
flags |= FrameworkPropertyMetadataOptions.NotDataBindable;
if (metadata.OverridesInheritanceBehavior)
flags |= FrameworkPropertyMetadataOptions.OverridesInheritanceBehavior;
if (metadata.SubPropertiesDoNotAffectRender)
flags |= FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender;
return flags;
}