Dot-Net

Silverlight:在佈局中查找所有類型的控制項

  • August 1, 2012

我正在尋找一種可靠的方法來建構包含在特定 <Panel> 派生控制項中的 <Type> 控制項列表 - 這包括那些是直接子代的控制項,以及那些是子代的子代等。

最明顯的方法是遞歸地執行此操作:

添加以列出該 <Type> 控制項的任何子項,然後對該控制項的任何子項(即 <Panel> 或後代)重複函式。

但是我擔心這不會在樹中找到所有控制項 - 任何 ContentControl 也可以包含 <Type> 控制項,HeaderedContentControl 或具有一個或多個子/內容屬性的任何其他類似控制項也可以。

是否有任何方法可以對實際的佈局樹執行搜尋,以便可以找到包含沒有特定父級的特定類型控制項的任何實例?

這是一個相當幼稚的擴展方法:-

public static class VisualTreeEnumeration
{
  public static IEnumerable&lt;DependencyObject&gt; Descendents(this DependencyObject root)
  {
    int count = VisualTreeHelper.GetChildrenCount(root);
    for (int i=0; i &lt; 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&lt;Button&gt;();

引用自:https://stackoverflow.com/questions/1784369