Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I find WPF controls by name or type?

Tags:

find

wpf

controls

I need to search a WPF control hierarchy for controls that match a given name or type. How can I do this?

like image 368
alex2k8 Avatar asked Mar 11 '09 21:03

alex2k8


People also ask

How can I find WPF controls by Name?

FindName method of FrameworkElement class is used to find elements or controls by their Name properties.

How do we refer to WPF controls in code?

Controls in WPF are accessed by their names (and the Name property). We specify the Name property in the XAML, and then can access the control by that name directly in C# code. This allows controls to interact. Example.

What are WPF controls?

WPF SDK continues to use the term "control" to loosely mean any class that represents a visible object in an application, it is important to note that a class does not need to inherit from the Control class to have a visible presence.


1 Answers

I combined the template format used by John Myczek and Tri Q's algorithm above to create a findChild Algorithm that can be used on any parent. Keep in mind that recursively searching a tree downwards could be a lengthy process. I've only spot-checked this on a WPF application, please comment on any errors you might find and I'll correct my code.

WPF Snoop is a useful tool in looking at the visual tree - I'd strongly recommend using it while testing or using this algorithm to check your work.

There is a small error in Tri Q's Algorithm. After the child is found, if childrenCount is > 1 and we iterate again we can overwrite the properly found child. Therefore I added a if (foundChild != null) break; into my code to deal with this condition.

/// <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> 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; } 

Call it like this:

TextBox foundTextBox =     UIHelper.FindChild<TextBox>(Application.Current.MainWindow, "myTextBoxName"); 

Note Application.Current.MainWindow can be any parent window.

like image 97
CrimsonX Avatar answered Sep 19 '22 14:09

CrimsonX