【问题标题】:WPF: Is it possible to get all elements on which certain attached property set?WPF:是否可以获取设置了某些附加属性的所有元素?
【发布时间】:2012-05-24 06:39:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf properties dependencies


    【解决方案1】:

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

    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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2013-08-17
      • 2015-10-15
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多