如何在控件(WPF,C#)中找到所有控件?

时间:2010-08-03 12:47:14

标签: wpf

我在How can I find WPF controls by name or type?中找到了有关此问题的有趣问题,但我只想让我的方法返回其中的所有控件。只要方法返回他可以找到的所有可能的控件,控件的名称或类型就无所谓了。

2 个答案:

答案 0 :(得分:0)

WinForms 中,这非常简单...只需抓取WinForms容器,然后探测'.Controls'属性并迭代返回的控件集合。< / p>

                    foreach (System.Windows.Forms.Control ctrl in form.Controls)
                    {                        
                        if (ctrl.Name == "tabPageControl")
                        { // do something with 'tabPageControl object' }
                    {

正如你在WinForms中看到的那样,它很容易在全局容器中访问以返回'ControlCollection',然后如果它是一个面板或类似的东西则迭代甚至更深。一旦找到了你想要的东西,只需建立一个可以找到的内容列表,然后对你的列表或你的控件做一些事情。

WPF 中,这样做略有不同。我没有广泛的WPF经验但是在玩了15分钟之后,我想出了这个:

           private void button1_Click(object sender, RoutedEventArgs e)
           {
              // cast out Grid object.
              Grid grd = (Grid) this.Content; 
              // do simple testing to find out what the type is.
              string s = grd.ToString(); 
              // in VS, in debug mode, hover 'grd.Children' and Smart Tool Tip that pops
              // it will tell exactly under a 'count' property how many controls there are sitting 
              // on the global container. For me it was just 1, my Button.
              foreach (UIElement child in grd.Children)
              {
                 // do some more testing to make sure have got the right control. pref in an If statement but anyhooo.
                 String sss = child.GetType().FullName; 
                 // cast out the appropriate type.
                 Button myWpfButton = (Button)child; 
              }
           }

我希望这能让你开始。

答案 1 :(得分:0)

这取决于父控件的类型。如果它是ContentControl的扩展,则它只能有一个子元素,可以在Content属性下找到。 如果它是Panel的扩展,它可以有许多子元素,可以在Children属性下找到。

不能保证这些子元素中的任何一个都必然是控件 - 您需要进行一些类型检查以确认它们是否属于您感兴趣的类型。

这也仅适用于单级父级子层次结构,但如果您需要所有子控件,则应该足够简单以进行递归。