【问题标题】:Find WPF control by Name按名称查找 WPF 控件
【发布时间】:2020-02-27 23:18:40
【问题描述】:

我正在寻求一些帮助,以找到引用已在 C# 中以编程方式构建的控件的最佳方法

如果我在 XAML 中预先包含一个标签并将其命名为 marketInfo,那么我可以在代码中设置 Tag 属性,例如

marketInfo.Tag = timeNow;

但是,我正在构建控件并使用类似于

的方式为每个控件分配一个名称
System.Windows.Controls.Label lbl = new System.Windows.Controls.Label();
lbl.Content = market.name + " - " + DateTime.Now.ToLocalTime().ToLongTimeString();
lbl.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left;
lbl.Height = 40;
lbl.Name = @"_" + "marketInfo" + countMarket;

如何从其他方法引用这些控件?我已经阅读了一些建议使用visualtreehelper 的帖子,但这似乎需要循环控件才能找到特定的控件。有没有办法通过名称访问控件以避免循环?

例如类似于

//pseudo code
SomeControl("_marketInfo5").Tag = timeNow;

谢谢

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    至少有两种方法可以做到这一点:

    • 使用父容器的FindName方法查找控件(但它内部会涉及循环,如visualtreehelper)

    • 创建一个字典来存储您创建的每个控件的引用

      var controls = new Dictionary<string, FrameworkElement>();
      controls.Add("_marketInfo5", lbl);
      

      那么你可以这样做:

      controls["_marketInfo5"].Tag = timeNow;
      

    【讨论】:

    • 字典是一种比递归更好的方法,尤其是当我需要的控件都是几层深的子控件时。我应该想到那个。谢谢。
    • 这是一个很棒的提示,它对我没有用,但它引导我找到了有效的方法。我必须使用control.Template.FindName("name") 才能得到我需要的孩子。
    【解决方案2】:

    您可以使用 XamlQuery 在运行时查找控件。XamlQuery In CodePlex

    XamlQuery.Search(RegisterGrid, "Label[Name=_marketInfo5]").SetValue(Control.TagProperty, timeNow);
    

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多