6

私はこのすべての魔法について少し不明確です。私が理解したように、依存関係プロパティは DependencyObject から継承されるため、値が保存されます。

  • 値が割り当てられている場合はインスタンス自体 (ローカル ディクショナリ内)
  • 値が指定されていない場合は、親要素へのリンクから取得されます。

    protected object GetValue(string propertyName)
    {
       if (LocalValues.ContainsKey(propertyName))
       {
          return LocalValues[propertyName];
       }
       return Parent.GetValue(propertyName);
    }
    

    私はこれで正しいですか?

添付プロパティの値がどこに保存されているのかもわかりませんか?

Control.FontSizeProperty = TextElement.FontSizeProperty.AddOwner(
typeof(Control), new FrameworkPropertyMetadata(SystemFonts.MessageFontSize,
FrameworkPropertyMetadataOptions.Inherits));

Attached プロパティで AddOwner メソッドを呼び出すと、インスタンス フィールドに値が割り当てられますか? これはいつ発生し、値はどこに行くのですか?

ありがとう!

4

2 に答える 2

3

依存関係プロパティの値は、プロパティ値を適用するオブジェクト (DependencyObject から派生) 内に格納されます。

たとえば、 TextElement.FontSizeProperty 添付プロパティを見てみましょう。

<StackPanel TextElement.FontSize="20" ... >
  ...
</StackPanel>

XAML パーサーはそれを次のように変換します。

...
TextElement.SetFontSize(stackPanel, 20);
...

内部的には次のとおりです。

public static void SetFontSize(DependencyObject element, double value)
{
  element.SetValue(TextElement.FontSizeProperty, value);
}

したがって、stackPanel オブジェクトで TextElement.FontSize を設定することは、呼び出しと同じです。

stackPanel.SetValue(TextElement.FontSizeProperty, value)

SetValue() は、DependencyObject クラスで定義されたメソッドです。メソッド内では多くの複雑な処理が行われますが、最終的に依存関係プロパティの有効な値は、EffectiveValueEntry という構造体にラップされ、DependencyObject 内の次のインスタンス フィールドに格納されます。

private EffectiveValueEntry[] _effectiveValues;
于 2013-12-23T15:50:46.197 に答える
2

WPF のプロパティ システムは非常に複雑です。MSDNには実に多くの情報がありますが、見つけるのが難しい場合がよくあります。を設定する方法はたくさんありますDependencyPropertyが、値がどこに保存されているかをにする必要があるかどうかはわかりません。

ローカル値の場合、DependencyObject文字列に基づいて格納されていないことに注意してください (ここでも格納場所を気にする必要はありません) に格納されていると想定できます。本当に のインスタンスに関連付けられていますDependencyProperty。これが、プロパティに所有者を追加する理由です。誰かTextElement.FontSizeがあなたのコントロールを設定した場合、それはあなたのローカルFontSizeプロパティを設定するのと同じです。

親からプロパティの値を継承する限り、これは添付プロパティでのみ発生します。MSDNエントリからFrameworkPropertyMetadataOptions

プロパティ値の継承は、アタッチされていない依存関係プロパティに対して機能するように見えるかもしれませんが、ランタイム ツリー内の特定の要素境界を介したアタッチされていないプロパティの継承動作は定義されていません。メタデータで Inherits を指定するプロパティを登録するには、常に RegisterAttached を使用します。

于 2013-08-12T15:25:40.937 に答える