如何按名称或类型查找 WPF 控件?

2024-01-08

我需要在 WPF 控件层次结构中搜索与给定名称或类型匹配的控件。我怎样才能做到这一点?


我将 John Myczek 使用的模板格式与上面的 Tri Q 算法结合起来,创建了一个可用于任何父级的 findChild 算法。请记住,向下递归搜索树可能是一个漫长的过程。我只在 WPF 应用程序上抽查过这一点,请评论您可能发现的任何错误,我将更正我的代码。

WPF 窥探 https://github.com/cplotts/snoopwpf是查看可视化树的有用工具 - 我强烈建议在测试或使用此算法检查您的工作时使用它。

Tri Q 的算法存在一个小错误。找到孩子后,如果 ChildrenCount > 1 并且我们再次迭代,我们可以覆盖正确找到的孩子。因此我添加了一个if (foundChild != null) break;进入我的代码来处理这种情况。

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

像这样称呼它:

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

Note Application.Current.MainWindow可以是任何父窗口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何按名称或类型查找 WPF 控件? 的相关文章

随机推荐

  • jquery wcf 肥皂调用失败

    有人知道我可以对 wcf 服务进行 jquerysoap 调用吗 我的 JQuery 代码 ajax url http localhost oseop orderingservice svc HelloWorld data txtTestR
  • Android 上的 Facebook 集成 fbconnect 断开的链接

    我正在尝试将 Facebook 集成到我的 Android 应用程序中 它可以正常登录 Facebook 但当它尝试将访问令牌传递回应用程序时 它只会返回 网页位于 fbconnect success access token 访问令牌 可
  • 使用 Caliburn.Micro 视图模型优先方法时如何在设计器中显示内容控制?

    我在 WPF 应用程序中使用 ViewModel first 方法使用 Caliburn Micro CM 我正在用命令栏和活动项目组成主视图 主 viewModel 设置命令栏 viewModel 的属性 并正确导航到活动项目 运行时一切
  • 如何缩放 UIButton 的 imageView?

    我使用以下命令创建了一个名为 button 的 UIButton 实例 其中包含图像 UIButton setImage forState Button frame 大于图像的大小 现在我想缩小这个按钮的图像 我尝试改变button ima
  • Typescript:如何基于数据结构生成和打印 AST

    我正在开始一个新项目 作为其界面的一部分 我们有一大堆 令牌 一个带有字符串值的递归对象 如下所示 const colors accent f90 primary active fff inactive silver 我们提供了一个实用程序
  • 使用 Eclipse AST

    我最近需要修改一些Java代码 添加方法 更改某些字段的签名和删除方法 我认为所有这些都可以通过使用Eclipse SDK的AST来完成 我从一些研究中知道如何解析源文件 但我不知道如何执行上述操作 有谁知道一个好的教程或者有人可以给我一个
  • kmean 需要三角不等式吗?

    我想知道对于 kmeans 中使用的距离度量是否需要三角不等式 k 均值是designed for 欧几里得距离 正好满足三角不等式 使用其他距离函数是有风险的 因为它可能会停止收敛 然而原因是not三角不等式 但是平均值可能不会最小化距离
  • Android Listview - 仅当用户停止滚动时将图像加载到项目中

    当用户快速滚动浏览项目时 开始请求图像来填充这些项目似乎是多余的 毕竟 用户滚动速度太快 它们永远不会被及时下载 显示 当用户实际暂停滚动时 是否有任何类型的方法 事件首先触发 尝试使用此代码来检测滚动停止 setOnScrollListe
  • 减少 WAV 声音文件大小,而不损失质量

    我的应用程序需要播放声音文件 我可以使用的唯一跨平台文件格式是 WAVE 我正在使用QSound http doc trolltech com 4 5 qsound html detailsQt 框架 这些声音的文件大小非常大 我想知道是否
  • InteractivePopGestureRecognizer 导致应用程序冻结

    在我的应用程序中 我有不同的控制器 当我将controller1推到导航控制器并滑动到后面时 一切正常 但是 如果我推导航控制器1 然后推入控制器1推控制器2并尝试向后滑动 我会得到一个冻结的应用程序 如果通过后退按钮返回一切正常 我怎样才
  • 如何在 Android Studio 运行时获取构建变体?

    我想在运行时获取构建变体 这是否可能不需要任何额外的配置或代码 查看生成的BuildConfig class public final class BuildConfig public static final boolean DEBUG
  • sqlite3_fts5使用标点符号时出错

    我有一个问题字符串变量 其中包含 我的车在哪里 一词 当我尝试对此运行选择时 它崩溃了 String sql Select from tblHALv2001 WHERE tblHALv2001 MATCH question fts5 附近的
  • plotly.js 中的分类轴顺序

    我有一个plotly js 条形图 我试图使 calcategories 轴的顺序正确 每个类别都有一个条形 但有时它们是绿色的 有时是黄色的 条形图应按从最高到最低的顺序排列 但情节似乎是根据不同的填充对它们进行排序 数据 var dat
  • 不可选择的下拉列表

    有没有什么方法可以让下拉列表中没有任何项目可供选择 所以基本上 我只是想用它作为显示 隐藏列表的一种方式 我不想要任何悬停突出显示 也不希望能够更改所选项目 您能否建议这是否可能 或者如果有人有任何其他想法来实现类似的目标 您能否给我指出一
  • 如何更改用户控件的访问修饰符

    我在 xaml 中创建了一个用户控件 将其命名为 View 在 View xaml cs 中 我将类 View 的访问修饰符更改为内部 internal partial class View ViewBase 更改访问修饰符后 编译器会显示
  • 如何在 linux (RedHat 6) 上检查 java 版本

    I am trying to check what java version I have installed in my linux machine I have tried which java 我得到 usr bin java 但是当
  • XAML - 设置样式后文本未显示在我的文本框中

    因此 我在正在开发的应用程序中设置了文本框的样式 突然间我看不到绑定到文本框的任何文本 我觉得我缺少某种 ContentPresenter 无论如何 这是样式
  • 如何对 kubernetes 中运行的 Inception 服务的部署进行故障排除

    我正在关注使用 TensorFlow Serving 和 Kubernetes 服务 Inception 模型 https tensorflow github io serving serving inception html当我尝试从本地
  • 类型没有成员

    我正在 Swift 游乐场上玩一个新课程 由于某种原因 我不断收到错误 该类 没有成员类型 其名称是前面三行定义的常量 这是代码 import Foundation class DataModel let myCalendar NSCale
  • 如何按名称或类型查找 WPF 控件?

    我需要在 WPF 控件层次结构中搜索与给定名称或类型匹配的控件 我怎样才能做到这一点 我将 John Myczek 使用的模板格式与上面的 Tri Q 算法结合起来 创建了一个可用于任何父级的 findChild 算法 请记住 向下递归搜索