如何按类型获取WPF容器的子项?

如何按类型获取WPF容器的子项?

我怎样才能类型的子控件ComboBoxMyContainer Grid的WPF?

<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);


暮色呼如
浏览 704回答 3
3回答

蝴蝶刀刀

儿童是UIElements的集合。因此,您需要迭代项目并确定每个项目是否属于所需类型。幸运的是,已经有一个Linq方法就是这样,即Enumerable.OfType<T>可以使用Extension Method语法方便地调用它:var&nbsp;comboBoxes&nbsp;=&nbsp;this.MyContainer.Children.OfType<ComboBox>();此方法根据类型过滤集合,并在您的情况下仅返回类型的元素ComboBox。如果您只想要第一个ComboBox(如您的变量名可能建议的那样),您只需追加FirstOrDefault()对查询的调用:var&nbsp;myComboBox&nbsp;=&nbsp;this.MyContainer.Children.OfType<ComboBox>().FirstOrDefault();

拉莫斯之舞

此扩展方法将递归搜索所需类型的子元素:public&nbsp;static&nbsp;T&nbsp;GetChildOfType<T>(this&nbsp;DependencyObject&nbsp;depObj)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;T&nbsp;:&nbsp;DependencyObject{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(depObj&nbsp;==&nbsp;null)&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;VisualTreeHelper.GetChildrenCount(depObj);&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;child&nbsp;=&nbsp;VisualTreeHelper.GetChild(depObj,&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;=&nbsp;(child&nbsp;as&nbsp;T)&nbsp;??&nbsp;GetChildOfType<T>(child); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result&nbsp;!=&nbsp;null)&nbsp;return&nbsp;result; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;}所以使用它你可以要求MyContainer.GetChildOfType<ComboBox>()。

摇曳的蔷薇

所有这些答案,但一个使用递归,IMO只是跛脚:)获得视觉孩子:public&nbsp;static&nbsp;IEnumerable<T>&nbsp;FindVisualChildren<T>([NotNull]&nbsp;this&nbsp;DependencyObject&nbsp;parent)&nbsp;where&nbsp;T&nbsp;:&nbsp;DependencyObject{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(parent&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentNullException(nameof(parent)); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;queue&nbsp;=&nbsp;new&nbsp;Queue<DependencyObject>(new[]&nbsp;{parent}); &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(queue.Any()) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;reference&nbsp;=&nbsp;queue.Dequeue(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;count&nbsp;=&nbsp;VisualTreeHelper.GetChildrenCount(reference); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;count;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;child&nbsp;=&nbsp;VisualTreeHelper.GetChild(reference,&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(child&nbsp;is&nbsp;T&nbsp;children) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;children; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(child); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}让逻辑儿童:public&nbsp;static&nbsp;IEnumerable<T>&nbsp;FindLogicalChildren<T>([NotNull]&nbsp;this&nbsp;DependencyObject&nbsp;parent)&nbsp;where&nbsp;T&nbsp;:&nbsp;DependencyObject{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(parent&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentNullException(nameof(parent)); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;queue&nbsp;=&nbsp;new&nbsp;Queue<DependencyObject>(new[]&nbsp;{parent}); &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(queue.Any()) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;reference&nbsp;=&nbsp;queue.Dequeue(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;children&nbsp;=&nbsp;LogicalTreeHelper.GetChildren(reference); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;objects&nbsp;=&nbsp;children.OfType<DependencyObject>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;o&nbsp;in&nbsp;objects) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(o&nbsp;is&nbsp;T&nbsp;child) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;child; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(o); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}注意,这两个深遍历树,如果你想停止在第一次相遇,然后同时更改代码调用包括对queue.Enqueue在else块。
打开App,查看更多内容
随时随地看视频慕课网APP