在UWP页面中查找所有TextBox控件

时间:2016-03-13 20:35:39

标签: c# win-universal-app

我需要找到UWP页面上但没有运气的所有TextBox。我认为这将是Page.Controls上的一个简单的foreach,但这不存在。

使用DEBUG我可以看到,例如,一个网格。但是我必须首先将Page.Content转换为Grid才能看到Children集合。我不想这样做,因为它可能不是页面根目录下的网格。

提前谢谢。

更新:这与'按类型'在WPF窗口中查找所有控件不同。那是WPF。这是UWP。他们是不同的。

3 个答案:

答案 0 :(得分:6)

你快到了!将Page.Content转换为UIElementCollection,这样您就可以获得Children集合并且是通用的。

如果element是UIElement,那么你必须使你的方法递归并查找Content属性,或者如果element是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!

答案 1 :(得分:4)

您还可以使用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);

答案 2 :(得分:2)

在我看来,你可以像在WPF中那样做。因为UWP主要使用与WPF相同的XAML。

因此,请查看same question about WPF

的答案