csharp 在WPF VisualTree中按名称查找控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp 在WPF VisualTree中按名称查找控件相关的知识,希望对你有一定的参考价值。

/// <summary>
/// Finds a Child of a given item in the visual tree.
/// All credits to author CrimsonX: https://stackoverflow.com/questions/636383/how-can-i-find-wpf-controls-by-name-or-type
/// </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>
private 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;
}

以上是关于csharp 在WPF VisualTree中按名称查找控件的主要内容,如果未能解决你的问题,请参考以下文章

csharp 在C#中按值比较两个对象

正确理解WPF中的TemplatedParent

正确理解WPF中的TemplatedParent

WPF自学入门WPF路由事件之内置路由事件

如何在 WPF、C# 中按 CTRL+V 粘贴

WPF RoutedEvent and HitTest - 简书