3 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
兒童是UIElements的集合。因此,您需要迭代項(xiàng)目并確定每個(gè)項(xiàng)目是否屬于所需類型。幸運(yùn)的是,已經(jīng)有一個(gè)Linq方法就是這樣,即Enumerable.OfType<T>
可以使用Extension Method語(yǔ)法方便地調(diào)用它:
var comboBoxes = this.MyContainer.Children.OfType<ComboBox>();
此方法根據(jù)類型過濾集合,并在您的情況下僅返回類型的元素ComboBox
。
如果您只想要第一個(gè)ComboBox(如您的變量名可能建議的那樣),您只需追加FirstOrDefault()
對(duì)查詢的調(diào)用:
var myComboBox = this.MyContainer.Children.OfType<ComboBox>().FirstOrDefault();

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
此擴(kuò)展方法將遞歸搜索所需類型的子元素:
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>()
。

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
所有這些答案,但一個(gè)使用遞歸,IMO只是跛腳:)
獲得視覺孩子:
public static IEnumerable<T> FindVisualChildren<T>([NotNull] this DependencyObject parent) where T : DependencyObject{ if (parent == null) throw new ArgumentNullException(nameof(parent)); var queue = new Queue<DependencyObject>(new[] {parent}); while (queue.Any()) { var reference = queue.Dequeue(); var count = VisualTreeHelper.GetChildrenCount(reference); for (var i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(reference, i); if (child is T children) yield return children; queue.Enqueue(child); } }}
讓邏輯兒童:
public static IEnumerable<T> FindLogicalChildren<T>([NotNull] this DependencyObject parent) where T : DependencyObject{ if (parent == null) throw new ArgumentNullException(nameof(parent)); var queue = new Queue<DependencyObject>(new[] {parent}); while (queue.Any()) { var reference = queue.Dequeue(); var children = LogicalTreeHelper.GetChildren(reference); var objects = children.OfType<DependencyObject>(); foreach (var o in objects) { if (o is T child) yield return child; queue.Enqueue(o); } }}
注意,這兩個(gè)深遍歷樹,如果你想停止在第一次相遇,然后同時(shí)更改代碼調(diào)用包括對(duì)queue.Enqueue
在else
塊。
- 3 回答
- 0 關(guān)注
- 759 瀏覽
添加回答
舉報(bào)