如何以编程方式设置附加属性?

时间:2013-03-03 23:15:06

标签: c# wpf attached-properties

我正在阅读附加属性,我刚刚读到它们可以设置类似于以下内容:

Grid.SetRow(myElement, 0);

如果这是一种静态方法,Grid.SetRow()现在Grid应该将myElement放入哪个myElement?或者它以某种方式工作,以某种方式将Grid与第0行相关联,因此当有一个新的myElement对象包含myElement时,它只能检查哪一行{{1}}应该去吗?

2 个答案:

答案 0 :(得分:3)

设置附加属性时,该值仅存储在元素中,而不是附加属性所属的类型。

例如,附加的row属性实现如下:

public static readonly DependencyProperty RowProperty = ...;

public static void SetRow(UIElement element, int value)
{
    element.SetValue(RowProperty, value);
}

public static int GetRow(UIElement element)
{
    return (int)element.GetValue(RowProperty);
}

因此,当您致电Grid.SetRow时,会调用内部element.SetValue。由于element是依赖项对象,因此它可以存储这些附加属性。您可以将它想象为依赖项对象中的Dictionary<DependencyProperty, object>(虽然它实际上要复杂得多),您可以使用SetValueGetValue来访问它。

因此该值仅存储在依赖项对象本身内。现在,当Grid渲染自身时,它将遍历其子节点以调用其测量和布局例程。它还会为每个子节点调用Grid.GetRow以查看是否已设置附加的行属性,并相应地在其自己的布局阶段尊重这些选择。

答案 1 :(得分:1)

  

如果这是一个静态方法,Grid.SetRow()现在如何将myElement放入哪个Grid?

它不知道

  

或者它是否以某种方式将myElement与第0行相关联,所以当有一个包含myElement的新Grid对象时,它可以检查myElement应该去哪一行?

是的,完全