依赖/附加属性如何在内部工作以及值存储在何处?

elm*_*elm 6 wpf dependency-properties attached-properties

所有这些魔法让我有点不清楚.据我所知,依赖属性从DependencyObject继承,因此存储了值:

  • 在实例中如果赋值(在本地字典中)
  • 如果未指定值,则从链接获取父元素.

    protected object GetValue(string propertyName)
    {
       if (LocalValues.ContainsKey(propertyName))
       {
          return LocalValues[propertyName];
       }
       return Parent.GetValue(propertyName);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我这是对的吗?

我也不明白附加属性的值存储在哪里?

Control.FontSizeProperty = TextElement.FontSizeProperty.AddOwner(
typeof(Control), new FrameworkPropertyMetadata(SystemFonts.MessageFontSize,
FrameworkPropertyMetadataOptions.Inherits));
Run Code Online (Sandbox Code Playgroud)

Addached属性上的AddOwner方法调用是否为实例字段赋值?什么时候发生这种情况,价值在哪里?

谢谢!

Abe*_*cht 2

WPF 中的属性系统相当复杂。MSDN确实有很多信息,但往往很难找到。虽然DependencyProperty可以通过多种方式设置a ,但我不确定您是否需要关心值的存储位置。

对于本地值,您可以假设它存储在DependencyObject(同样您不应该关心它存储在哪里),但需要注意的是它们不是基于字符串存储的。它确实与 的一个实例相关联DependencyProperty。这就是您想要为该财产添加所有者的原因。如果有人设置TextElement.FontSize你的控件,就像设置你的本地FontSize属性一样。

就从父级继承属性值而言,这只发生在附加属性上。来自MSDN条目FrameworkPropertyMetadataOptions:

尽管属性值继承似乎适用于非附加依赖属性,但通过运行时树中某些元素边界的非附加属性的继承行为是未定义的。始终使用 RegisterAttached 注册您在元数据中指定继承的属性。