【问题标题】: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;
}
}
}