Mar*_*eIV 5 wpf dependency-properties measureoverride
我们需要覆盖DependencyProperty子类的元数据.现在我知道我可以使用OverrideMetadata并指定全新的FrameworkPropertyMetadata对象,但在大多数情况下,我希望这个新的元数据与现有的元数据完全相同,除了另外一个标志集(具体AffectsMeasure)
我的想法是获取现有的元数据,创建一个新的元数据对象,手动复制从旧到新的所有成员(它不支持Clone)更改我想要的那个,然后在OverrideMetadata调用中使用新的成员.但是da**对于其他非常简单的事情来说是很多工作!
我在这里错过了什么吗?
首先,我的意思AffectsMeasure不是AffectsRender(我已经改变了),
但是......我刚刚发现我们的班级已经AffectsMeasure为该Width物业设置了旗帜.真正的问题是a ListBox(例如a ListBoxItem)的容器MeasureOverride在首次初始化时仅被调用一次.
由于这在技术上是一个无关的问题,我将开始一个新的并关闭这一个.
这是新问题的链接:
从基类的元数据复制元数据绝对是正确的方法。尽管不幸的是,该类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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
579 次 |
| 最近记录: |