7

特定の <Panel> 派生コントロールに含まれる <Type> のコントロールのリストを作成するための信頼できる方法を探しています。これには、直接の子であるコントロールと、子の子であるコントロールが含まれます。

最も明白な方法は、再帰的に行うことでした:
<Type> のこのコントロールの子をリストに追加し、<Panel> または子孫であるこのコントロールの子に対して関数を繰り返します。

ただし、これでツリー内のすべてのコントロールが検出されるわけではないことが懸念されます。ContentControl には <Type> のコントロールが含まれる可能性があり、HeaderedContentControl または 1 つ以上の子/コンテンツ属性を持つ他の同様のコントロールも含まれる可能性があります。

特定の親なしで含まれる特定のタイプのコントロールのインスタンスを見つけることができるように実際のレイアウト ツリーに対して検索を実行する手段はありますか?

4

2 に答える 2

20

これはかなり単純な拡張メソッドです:-

public static class VisualTreeEnumeration
{
   public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
   {
     int count = VisualTreeHelper.GetChildrenCount(root);
     for (int i=0; i < count; i++)
     {
       var child = VisualTreeHelper.GetChild(root, i);
       yield return child;
       foreach (var descendent in Descendents(child))
         yield return descendent;
     }
   }
}

このアプローチには、進行中にツリー メンバーシップに変更が発生しないと想定しているという欠点があります。これは、ToList() を使用することで軽減できます。

これで、LINQ を使用して要件を有効にすることができます:-

 var qryAllButtons = myPanel.Descendents().OfType<Button>();
于 2009-11-23T17:48:39.543 に答える
1

GRID で始まり、コンボボックスを含むネストされたグリッド、スタックパネル、キャンバスなどを持つ userControl 内のコンボボックスを見つけたいとしましょう。

  1. Imports System.Windows.Controls.Primitives(または C# の使用)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

それでおしまい...

于 2012-08-01T14:06:38.493 に答える