ビジュアルツリーを列挙して、各要素にプロパティが設定されているかどうかを確認できます。このようなもの:
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;
}
}
}