如何让types的WPF容器的孩子?

我怎样才能在WPF中的MyContainer Grid中获得ComboBoxtypes的子控件?

 <Grid x:Name="MyContainer"> <Label Content="Name" Name="label1" /> <Label Content="State" Name="label2" /> <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox1"/> <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox3" /> <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox4" /> </Grid> 

这行给了我一个错误:

 var myCombobox = this.MyContainer.Children.GetType(ComboBox); 

此扩展方法将recursionsearch所需types的子元素:

 public static T GetChildOfType<T>(this DependencyObject depObj) where T : DependencyObject { if (depObj == null) return null; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { var child = VisualTreeHelper.GetChild(depObj, i); var result = (child as T) ?? GetChildOfType<T>(child); if (result != null) return result; } return null; } 

所以使用它你可以要求MyContainer.GetChildOfType<ComboBox>()

儿童是UIElements的集合。 所以你需要遍历这些项目,并确定每个项目是否是必需的types。 幸运的是,已经有了一个Linq方法,就是这个方法,即Enumerable.OfType<T> ,你可以使用扩展方法的语法方便地调用它:

 var comboBoxes = this.MyContainer.Children.OfType<ComboBox>(); 

这个方法根据types过滤集合,在你的情况下,只返回ComboBoxtypes的元素。

如果您只想要第一个ComboBox(如您的variables名称可能会提示),您可以将一个调用附加到查询的FirstOrDefault()

 var myComboBox = this.MyContainer.Children.OfType<ComboBox>().FirstOrDefault(); 

search包含预定点(屏幕)的特定types的第一个孩子:

(参数“point”是调用“PointToScreen”函数的结果(在Visualtypes中声明))

 private TDescendantType FindDescendant<TDescendantType>(DependencyObject parent, Point screenPoint) where TDescendantType : DependencyObject { int count = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is Visual) { Point point = ((Visual)child).PointFromScreen(screenPoint); Rect rect = VisualTreeHelper.GetDescendantBounds((Visual)child); if (!rect.Contains(point)) continue; } if (child is TDescendantType) { return (TDescendantType)child; } child = FindDescendant<TDescendantType>(child, screenPoint); if (child != null) { return (TDescendantType)child; } } return null; }