我如何获得ContentPresenter的孩子?

Jon*_*len 23 wpf

使用代码我可以获得内容演示者.我想在其中找到第一个文本框并相应地设置焦点.

Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)
Run Code Online (Sandbox Code Playgroud)

alp*_*use 28

您可以使用VisualTreeHelper静态类来抓取控件树.这是如何在c#中完成的(抱歉,我是VB阅读障碍者))

 T FindFirstChild<T>(FrameworkElement element) where T: FrameworkElement
    {
        int childrenCount = VisualTreeHelper.GetChildrenCount(element);
        var children = new FrameworkElement[childrenCount];

        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement;
            children[i] = child;
            if (child is T)
                return (T)child;
        }

        for (int i = 0; i < childrenCount; i++)
            if (children[i] != null)
            {
                var subChild = FindFirstChild<T>(children[i]);
                if (subChild != null)
                    return subChild;
            }

        return null;
    }
Run Code Online (Sandbox Code Playgroud)

  • 这适用于大多数Framework元素,但对于ContentPresenter不起作用 (3认同)
  • @John:听起来很奇怪.那究竟是什么问题呢?您是否无法在树中找到ContentPresenter,或找到ContentPresenter的子项?可能是在你搜索时,视觉树还没有建成吗? (2认同)
  • @ Alpha-mouse:你明白了!我在列表中添加一个元素,然后立即尝试将其中一个控件聚焦.使用调度程序将焦点操作安排到后台优先级修复了我的问题. (2认同)

epo*_*pox 9

ContentPresenter有唯一的孩子.你只需要孩子

VisualTreeHelper.GetChild(yourContentPresenterObj, 0);
Run Code Online (Sandbox Code Playgroud)

如果您需要更深入 - 首先找到TextBox,那么,是的,您使用@ alpha-mouse建议的更全面的方法.