gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:21:04 27 4
gpt4 key购买 nike

我对所有这些魔法有点不清楚。
据我了解,依赖属性是从 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));

    对附加属性的 AddOwner 方法调用是否为实例字段赋值?这什么时候发生,值(value)在哪里?

    谢谢!

    最佳答案

    依赖属性的值存储在我们应用属性值的对象(派生自 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;

    关于wpf - 依赖/附加属性如何在内部工作以及值存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190243/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com