Get WPF window by hWnd

后端 未结 4 835
臣服心动
臣服心动 2020-12-17 16:42

I am looking to get a WPF window and traverse it\'s controls. I\'m able to get the hWnd and i\'ve found other posts on traversing the controls using a DependencyObject. How

4条回答
  •  清歌不尽
    2020-12-17 17:07

    After you get the window itself (as Marat points out how to do that) you need to search the visual tree. Here are two helper functions

    find all children of a type

    public static IEnumerable FindChildren(this DependencyObject source) where T : DependencyObject
        {
          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)
              {
                yield return (T)child;
              }
    
              //recurse tree
              foreach (T descendant in FindChildren(child))
              {
                yield return descendant;
              }
            }
          }
        }
    

    https://sites.google.com/site/bobstechwiki/home/wpf-ji-shu-1/find-element-by-visual-tree

    to find a child by name:

     public static T FindChild(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(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;
        }
    

    How can I find WPF controls by name or type?

提交回复
热议问题