@@ -29,29 +29,43 @@ public INItializableWindow(WindowManager windowManager) : base(windowManager)
2929 /// instead of the window's name.
3030 /// </summary>
3131 protected string IniNameOverride { get ; set ; }
32+ private bool VisitChild ( IEnumerable < XNAControl > list , Func < XNAControl , bool > judge )
33+ {
34+ foreach ( XNAControl child in list )
35+ {
36+ bool stop = judge ( child ) ;
37+ if ( stop ) return true ;
38+ stop = VisitChild ( child . Children , judge ) ;
39+ if ( stop ) return true ;
40+ }
41+ return false ;
42+ }
3243
3344 public T FindChild < T > ( string childName , bool optional = false ) where T : XNAControl
3445 {
35- T child = FindChild < T > ( Children , childName ) ;
36- if ( child == null && ! optional )
46+ XNAControl result = null ;
47+ VisitChild ( new List < XNAControl > ( ) { this } , control =>
48+ {
49+ if ( control . Name != childName ) return false ;
50+ result = control ;
51+ return true ;
52+ } ) ;
53+ if ( result == null && ! optional )
3754 throw new KeyNotFoundException ( "Could not find required child control: " + childName ) ;
38-
39- return child ;
55+ return ( T ) result ;
4056 }
4157
42- private T FindChild < T > ( IEnumerable < XNAControl > list , string controlName ) where T : XNAControl
58+ public List < T > FindChildrenStartWith < T > ( string prefix ) where T : XNAControl
4359 {
44- foreach ( XNAControl child in list )
60+ List < T > result = new List < T > ( ) ;
61+ VisitChild ( new List < XNAControl > ( ) { this } , ( control ) =>
4562 {
46- if ( child . Name == controlName )
47- return ( T ) child ;
48-
49- T childOfChild = FindChild < T > ( child . Children , controlName ) ;
50- if ( childOfChild != null )
51- return childOfChild ;
52- }
53-
54- return null ;
63+ if ( string . IsNullOrEmpty ( prefix ) ||
64+ ! string . IsNullOrEmpty ( control . Name ) && control . Name . StartsWith ( prefix ) )
65+ result . Add ( ( T ) control ) ;
66+ return false ;
67+ } ) ;
68+ return result ;
5569 }
5670
5771 /// <summary>
0 commit comments