2016-03-13 6 views
4

Мне нужно найти все TextBox (ы), которые находятся на странице UWP, но не повезло. Я думал, что это будет простой foreach на Page.Controls, но этого не существует.Найти все элементы управления TextBox в UWP Страница

Использование DEBUG Я могу видеть, например, сетку. Но перед тем, как я увижу коллекцию Children, я должен сначала перенести страницу. Контракт в сетку. Я не хочу этого делать, поскольку это может быть не Grid в корне страницы.

Заранее спасибо.

UPDATE: Это не то же самое, что «Найти все элементы управления в окне WPF по типу». Это WPF. Это UWP. Они разные.

+1

Возможный дубликат [Найти все элементы управления в окне WPF по типу] (http://stackoverflow.com/questions/974598/find-all-controls-in-wpf-window-by-type) – RredCat

+1

Не дубликат точно. Хотелось бы, чтобы все было так просто. Извините RredCat. –

+1

Можете ли вы сказать, что не работает с методом в ответе, упомянутом RredCat? В этой части он работает одинаково в UWP и WPF. – Romasz

ответ

6

Вы почти у цели! Отправляйте страницу. Контент в UIElementCollection, таким образом вы можете получить коллекцию Children и быть универсальной.

Вам нужно будет обработать свой метод и посмотреть либо свойство Content, если элемент является элементом UIElement или Children, если это элемент UIElementCollection.

Вот пример:

void FindTextBoxex(object uiElement, IList<TextBox> foundOnes) 
    { 
     if (uiElement is TextBox) 
     { 
      foundOnes.Add((TextBox)uiElement); 
     } 
     else if (uiElement is Panel) 
     { 
      var uiElementAsCollection = (Panel)uiElement; 
      foreach (var element in uiElementAsCollection.Children) 
      { 
       FindTextBoxex(element, foundOnes); 
      } 
     } 
     else if (uiElement is UserControl) 
     { 
      var uiElementAsUserControl = (UserControl)uiElement; 
      FindTextBoxex(uiElementAsUserControl.Content, foundOnes); 
     } 
     else if (uiElement is ContentControl) 
     { 
      var uiElementAsContentControl = (ContentControl)uiElement; 
      FindTextBoxex(uiElementAsContentControl.Content, foundOnes); 
     } 
     else if (uiElement is Decorator) 
     { 
      var uiElementAsBorder = (Decorator)uiElement; 
      FindTextBoxex(uiElementAsBorder.Child, foundOnes); 
     } 
    } 

Затем вызывается этот метод с:

 var tb = new List<TextBox>(); 
     FindTextBoxex(this, tb); 
     // now you got your textboxes in tb! 
+0

Привет, Амо. Я пробовал это. У меня есть мой метод, который принимает параметр UIElementCollection. Тем не менее, в моем foreach переменная UIElements не имеет ни содержимого, ни детей, если я не произнесет явно Grid или StackPanel. Сводит меня с ума! LOL –

+0

Это потому, что вам нужно сделать что-то вроде: if (element is UIElementCollection) {элемент var panelElement = (UIElementCollection); // теперь получаем panelElement.Children} Опубликуйте свой код, и я исправлю его. –

+0

На самом деле у меня не получилось никакого кода, поскольку я не смог никуда уйти, не обращая внимания на такие вещи, как Грид. Мой голый метод кости выглядит просто, как это ... –

1

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

Так, пожалуйста, проверьте ответ для same question about WPF

+0

Спасибо RredCat. К сожалению, UWP несколько отличается от WPF. Все, что легко с WPF, является такой проблемой в UWP. –

3

Вы также можете использовать следующий genric метод из VisualTreeHelper documentation получить все дочерние элементы данного типа:

internal static void FindChildren<T>(List<T> results, DependencyObject startNode) 
    where T : DependencyObject 
{ 
    int count = VisualTreeHelper.GetChildrenCount(startNode); 
    for (int i = 0; i < count; i++) 
    { 
     DependencyObject current = VisualTreeHelper.GetChild(startNode, i); 
     if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T)))) 
     { 
      T asType = (T)current; 
      results.Add(asType); 
     } 
     FindChildren<T>(results, current); 
    } 
} 

Это в основном рекурсивно получить дети для текущего элемента и добавьте любой элемент, соответствующий запрошенному типу, в предоставленный список.

Тогда вы просто должны сделать следующее где-то, чтобы получить свои элементы:

var allTextBoxes = new List<TextBox>(); 
FindChildren(allTextBoxes, this); 
Смежные вопросы