1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
6
using System.Collections.Generic;
9
using System.Windows.Media;
10
using System.Windows.Media.Media3D;
14
namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common
16
public class VisualTreeHelperUtil
18
public static T GetControlAscendant<T>(object reference) where T : DependencyObject
20
return GetControlAscendant<T>(reference as DependencyObject);
22
public static T GetControlAscendant<T>(DependencyObject reference) where T : DependencyObject
24
if (reference == null || !(reference is Visual || reference is Visual3D))
26
DependencyObject parent = reference;
29
while (!((parent = VisualTreeHelper.GetParent(parent)) == null || parent is T)) ;
38
public static bool IsAscendant(DependencyObject parent, DependencyObject child)
40
if (parent == null || child == null)
42
DependencyObject parentTmp = child;
43
while (!((parentTmp = VisualTreeHelper.GetParent(parentTmp)) == null || parentTmp == parent)) ;
44
return parentTmp != null;
47
public static IEnumerable<T> GetControlsDecendant<T>(object reference) where T : DependencyObject
49
return GetControlsDecendant<T>(reference as DependencyObject);
51
public static IEnumerable<T> GetControlsDecendant<T>(DependencyObject reference) where T : DependencyObject
53
if (reference == null)
55
int nbChildren = VisualTreeHelper.GetChildrenCount(reference);
56
for (int index = 0; index < nbChildren; index++)
58
var child = VisualTreeHelper.GetChild(reference, index);
62
foreach (var childValue in GetControlsDecendant<T>(child))
63
yield return childValue;
68
public static FrameworkElement GetFocusedElement(DependencyObject reference)
70
return VisualTreeHelperUtil.GetControlsDecendant<FrameworkElement>(reference).FirstOrDefault(fe => fe.IsFocused);