Created
October 17, 2018 09:07
-
-
Save iwannabebot/47e3c6229f2bb45b2294be7183f499e5 to your computer and use it in GitHub Desktop.
Search a WPF control hierarchy for controls that match a given name or type
This file contains hidden or 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
/// <summary> | |
/// Finds a Child of a given item in the visual tree. | |
/// </summary> | |
/// <param name="parent">A direct parent of the queried item.</param> | |
/// <typeparam name="T">The type of the queried item.</typeparam> | |
/// <param name="childName">x:Name or Name of child. </param> | |
/// <returns>The first parent item that matches the submitted type parameter. | |
/// If not matching item can be found, | |
/// a null parent is being returned.</returns> | |
/// Usage: | |
/// foundTextBox = UIHelper.FindChild<TextBox>(Application.Current.MainWindow, "myTextBoxName"); | |
public static T FindChild<T>(DependencyObject parent, string childName) | |
where T : DependencyObject | |
{ | |
// Confirm parent and childName are valid. | |
if (parent == null) return null; | |
T foundChild = null; | |
int childrenCount = VisualTreeHelper.GetChildrenCount(parent); | |
for (int i = 0; i < childrenCount; i++) | |
{ | |
var child = VisualTreeHelper.GetChild(parent, i); | |
// If the child is not of the request child type child | |
T childType = child as T; | |
if (childType == null) | |
{ | |
// recursively drill down the tree | |
foundChild = FindChild<T>(child, childName); | |
// If the child is found, break so we do not overwrite the found child. | |
if (foundChild != null) break; | |
} | |
else if (!string.IsNullOrEmpty(childName)) | |
{ | |
var frameworkElement = child as FrameworkElement; | |
// If the child's name is set for search | |
if (frameworkElement != null && frameworkElement.Name == childName) | |
{ | |
// if the child's name is of the request name | |
foundChild = (T)child; | |
break; | |
} | |
} | |
else | |
{ | |
// child element found. | |
foundChild = (T)child; | |
break; | |
} | |
} | |
return foundChild; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment