3

我创建了一个自定义附加属性,该属性应设置在某些不相关的元素上。此附加属性的目的是保持所有这些元素的宽度相同。因此,当这些元素中的任何一个更改宽度时,它应该使用此附加属性集更新所有其他元素。我可以通过 UIPropertyMetadata 设置的“DP 属性更改事件处理程序”跟踪附加属性的更改,因此当任何元素更改宽度时,我都会收到该通知。然后我需要做的是更新具有此附加属性集的所有其他元素。

所以我想知道是否有可能做到这一点?有没有办法枚举具有某些附加属性集的所有 DependencyObject 实例?

我想这是一个有点高级的 WPF 东西,但它在我的 WPF 应用程序中是非常具体的特定要求。

4

1 回答 1

3

您可以枚举可视化树并检查是否在每个元素上设置了属性。像这样的东西:

var objectsWithPropertySet = new List<DependencyObject>();
if (RootVisual.ReadLocalValue(FocusIdProperty) != DependencyProperty.UnsetValue)
    objectsWithPropertySet.Add(RootVisual);

objectsWithPropertySet.AddRange(RootVisual.GetAllChildren()
    .Where(o => o.ReadLocalValue(FocusIdProperty) != DependencyProperty.UnsetValue));

GetAllChildren() 扩展方法是这样实现的:

public static class VisualTreeHelperExtensions
{
    public static IEnumerable<DependencyObject> GetAllChildren(this DependencyObject parent)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            // retrieve child at specified index
            var directChild = (Visual)VisualTreeHelper.GetChild(parent, i);

            // return found child
            yield return directChild;

            // return all children of the found child
            foreach (var nestedChild in directChild.GetAllChildren())
                yield return nestedChild;
        }
    }
}
于 2012-12-11T10:46:38.063 回答