如何让types的WPF容器的孩子?
我怎样才能在WPF中的MyContainer
Grid
中获得ComboBox
types的子控件?
<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过滤集合,在你的情况下,只返回ComboBox
types的元素。
如果您只想要第一个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; }