2009-11-23 9 views
7

में टाइप के सभी नियंत्रणों को ढूंढें। < के नियंत्रण की एक सूची बनाने के लिए मैं एक विश्वसनीय विधि की तलाश कर रहा हूं, एक विशिष्ट < पैनल> व्युत्पन्न नियंत्रण में निहित प्रकार - इसमें सीधे बच्चे हैं, और वे जो बच्चों के बच्चे हैं और इसी तरह।
< प्रकार के इस नियंत्रण> के किसी भी बच्चों को सूचीबद्ध करने के लिए जोड़ कर इस पर नियंत्रण है जो एक < कक्ष> या वंशज है के किसी भी बच्चे के लिए समारोह दोहराने:सिल्वरलाइट: लेआउट

सबसे स्पष्ट रास्ता बस इसे रिकर्सिवली करने के लिए किया गया था।

हालांकि मुझे चिंता है कि यह पेड़ में सभी नियंत्रण नहीं पाएगा - किसी भी सामग्री नियंत्रण में < प्रकार का नियंत्रण भी हो सकता है, जैसा हेड्रेडकंटेंट नियंत्रण या एक या अधिक बच्चे/सामग्री विशेषताओं के साथ कोई अन्य समान नियंत्रण हो सकता है ।

क्या वास्तविक लेआउट पेड़ के खिलाफ खोज निष्पादित करने का कोई साधन है, ताकि कोई विशिष्ट विशिष्ट नियंत्रण के बिना निहित विशिष्ट प्रकार के नियंत्रण का उदाहरण पाया जा सके?

उत्तर

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>(); 
+0

हाँ, अच्छी तरह से काम करता है। धन्यवाद। – Jonx

+0

@ एंथनीWJones जब मैं descendents का उपयोग करता हूं कोई नियंत्रण मेरे लिए पीछे हट जाएगा, मैं ट्रेस हूं और VisualTreeHelper.GetChildrenCount (रूट) 0 गिनती वापस करेगा, क्यों? –

1

मान लीजिए कि आप एक UserControl जो एक ग्रिड के साथ शुरू होता है और ग्रिड, stackpanels, कैनवास आदि युक्त comboboxes

नेस्ट है अंदर comboboxes को खोजने के लिए चाहते हैं
  1. Imports System.Windows.Controls.Primitives (या सी # के लिए उपयोग करना)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

यह है ...

+0

'GetVisualDescendants' मुख्य सिल्वरलाइट वितरण AFAICT में नहीं है। (नोट [एमएसडीएन] पर कोई साधारण परिभाषा नहीं है (http://google.com/search?q=GetVisualDescendants+site%3Amsdn.microsoft.com+-site%3Asocial.msdn.microsoft.com)।) 'System.Windows.Controls .Toolkit' [लगता है] (http://stackoverflow.com/a/7442356/256431) आवश्यक होने के लिए। –

+0

System.Windows.Controls.Primitives निम्न निर्देशिका में System.Windows.Controls का एक हिस्सा है: c: \ प्रोग्राम फ़ाइलें (x86) \ Microsoft SDKs \ Silverlight \ v5.0 \ पुस्तकालय \ क्लाइंट \ System.Windows.Controls। dll। –