5

DependencyPropertyサブクラスののメタデータをオーバーライドする必要があります。OverrideMetadataこれで、まったく新しいオブジェクトを使用および指定できることがわかりFrameworkPropertyMetadataましたが、ほとんどの場合、この新しいメタデータは、1つの追加のフラグが設定されていることを除いて、既存のメタデータとまったく同じである必要があります(具体的にはAffectsMeasure

私の考えは、既存のメタデータを取得し、新しいメタデータオブジェクトを作成し、すべてのメンバーを古いものから新しいものに手動でコピーして(サポートしていませんClone)、必要なものを変更してから、OverrideMetadata呼び出しで新しいものを使用することです。 。しかし、da **は、他の点では非常に単純なものにとっては多くの作業です。

ここで何かが足りませんか?

編集

まず最初に、私は(上記で変更した)ではAffectsMeasureないことを意味しました、AffectsRender

しかし...私はちょうど私たちのクラスがすでにプロパティにAffectsMeasureフラグを設定していることを知りました。本当の問題は、 (たとえば)のWidthコンテナの場合、最初に初期化されたときに1回だけ呼び出されることです。ListBoxListBoxItemMeasureOverride

これは技術的には無関係な質問なので、新しい質問を開始して閉じます。

新しい質問へのリンクは次のとおりです。

幅が変更されたときにListBoxItemがMeasureOverrideを呼び出さないのはなぜですか?

4

1 に答える 1

2

基本クラスのメタデータからメタデータをコピーすることは、間違いなく進むべき道です。残念ながら、FrameworkPropertyMetadataクラスは指定されたフラグを公開しませんがbool、状態を示すプロパティとして公開されます。これらの値をとして戻すにはFrameworkPropertyMetadataOptions、関連するプロパティを調べて、それらを1つとして読み戻す必要があります。

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;
}
于 2011-10-04T06:47:42.610 に答える