Как найти все элементы управления внутри элемента управления (WPF, C #)? - PullRequest
1 голос
/ 03 августа 2010

Я нашел интересные вопросы по этому поводу, например Как найти элементы управления WPF по имени или типу? , но я просто хочу, чтобы мой метод возвращал все элементы управления внутри него. Не имеет значения имя элемента управления или его тип, если метод возвращает все возможные элементы управления, которые он может найти.

Ответы [ 2 ]

0 голосов
/ 04 августа 2010

Зависит от типа родительского контроля. Если это расширение ContentControl, у него может быть только один дочерний элемент, который находится в свойстве Content. Если это расширение Panel, оно может иметь много дочерних элементов, которые находятся в свойстве Children.

Нет никакой гарантии, что какой-либо из этих дочерних элементов обязательно является элементом управления - вам нужно будет выполнить некоторую проверку типов, чтобы подтвердить, относятся ли они к тому типу, который вам интересен.

Это также относится только к одному уровню иерархии родитель-потомок, но должно быть достаточно простым, чтобы сделать его рекурсивным, если вам нужны все дочерние элементы управления.

0 голосов
/ 03 августа 2010

В WinForms это очень просто ... просто захватите контейнер WinForms, а затем проверьте свойство '.Controls' и выполните итерацию по коллекции возвращенных элементов управления.

                    foreach (System.Windows.Forms.Control ctrl in form.Controls)
                    {                        
                        if (ctrl.Name == "tabPageControl")
                        { // do something with 'tabPageControl object' }
                    {

Как вы видите в WinForms, его очень легко получить доступ к глобальному контейнеру, чтобы вернуть 'ControlCollection', а затем перебрать или даже глубже, если это панель или что-то в этом роде. Как только вы нашли то, что хотите, просто создайте список того, что можно найти, и сделайте что-нибудь со своим списком или под вашим контролем.

В WPF , это сделано немного иначе. У меня нет большого опыта работы с WPF, но после 15 минут игры я придумал:

           private void button1_Click(object sender, RoutedEventArgs e)
           {
              // cast out Grid object.
              Grid grd = (Grid) this.Content; 
              // do simple testing to find out what the type is.
              string s = grd.ToString(); 
              // in VS, in debug mode, hover 'grd.Children' and Smart Tool Tip that pops
              // it will tell exactly under a 'count' property how many controls there are sitting 
              // on the global container. For me it was just 1, my Button.
              foreach (UIElement child in grd.Children)
              {
                 // do some more testing to make sure have got the right control. pref in an If statement but anyhooo.
                 String sss = child.GetType().FullName; 
                 // cast out the appropriate type.
                 Button myWpfButton = (Button)child; 
              }
           }

Надеюсь, этого хватит, чтобы вы начали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...