-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #20 from dojo90/develop
Develop
- Loading branch information
Showing
4 changed files
with
130 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
using System.Collections.Generic; | ||
using System.Windows; | ||
using System.Windows.Media; | ||
|
||
namespace DJ.Extensions | ||
{ | ||
public static class DependencyObjectExtensions | ||
{ | ||
/// <summary> | ||
/// Analyzes both visual and logical tree in order to find all elements of a given | ||
/// type that are descendants of the <paramref name="source"/> item. | ||
/// </summary> | ||
/// <typeparam name="T">The type of the queried items.</typeparam> | ||
/// <param name="source">The root element that marks the source of the search. If the | ||
/// source is already of the requested type, it will not be included in the result.</param> | ||
/// <param name="uid">The UID of the <see cref="UIElement"/></param> | ||
/// <returns>All descendants of <paramref name="source"/> that match the requested type.</returns> | ||
public static T FindChildByUid<T>(this DependencyObject source, string uid) where T : UIElement | ||
{ | ||
if (source != null) | ||
{ | ||
var childs = GetChildObjects(source); | ||
foreach (DependencyObject child in childs) | ||
{ | ||
//analyze if children match the requested type | ||
if (child != null && child is T dependencyObject && dependencyObject.Uid.Equals(uid)) | ||
{ | ||
return dependencyObject; | ||
} | ||
|
||
var descendant = FindChildByUid<T>(child, uid); | ||
if (descendant != null) | ||
return descendant; | ||
} | ||
} | ||
|
||
return null; | ||
} | ||
|
||
/// <summary> | ||
/// This method is an alternative to WPF's | ||
/// <see cref="VisualTreeHelper.GetChild"/> method, which also | ||
/// supports content elements. Keep in mind that for content elements, | ||
/// this method falls back to the logical tree of the element. | ||
/// </summary> | ||
/// <param name="parent">The item to be processed.</param> | ||
/// <returns>The submitted item's child elements, if available.</returns> | ||
public static IEnumerable<DependencyObject> GetChildObjects(this DependencyObject parent) | ||
{ | ||
if (parent == null) yield break; | ||
|
||
if (parent is ContentElement || parent is FrameworkElement) | ||
{ | ||
//use the logical tree for content / framework elements | ||
foreach (object obj in LogicalTreeHelper.GetChildren(parent)) | ||
{ | ||
var depObj = obj as DependencyObject; | ||
if (depObj != null) yield return (DependencyObject) obj; | ||
} | ||
} | ||
else | ||
{ | ||
//use the visual tree per default | ||
int count = VisualTreeHelper.GetChildrenCount(parent); | ||
for (int i = 0; i < count; i++) | ||
{ | ||
yield return VisualTreeHelper.GetChild(parent, i); | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters