我如何获得ContentPresenter的孩子?

时间:2010-11-12 10:38:05

标签: wpf

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

Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)

4 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:9)

ContentPresenter 是唯一的孩子。您只需

即可孩子
VisualTreeHelper.GetChild(yourContentPresenterObj, 0);

如果你需要更深入 - 直到第一次找到TextBox ,那么,是的,你使用@ alpha-mouse建议的更全面的方法。

答案 2 :(得分:3)

Dim myContentPresenter = CType(obj, ContentPresenter)
Dim myDataTemplate = myContentPresenter.ContentTemplate
Dim target = CType(myDataTemplate.FindName("txtQuantity", myContentPresenter), TextBox)

答案 3 :(得分:0)

对于我来说,我需要迭代放置在ItemsControl内部使用的自定义画布上的某种基本类型的所有控件。

此Linq表达式用于从MeasureOverride()中获取这些控件:

var foobarControls =
    InternalChildren
    .OfType<ContentPresenter>()
    .Where(c => VisualTreeHelper.GetChildrenCount(c) > 0)
    .Select(c => VisualTreeHelper.GetChild(c, 0))
    .OfType<FoobarControlBase>();

这可以防止ContentPresenter没有孩子的情况。我发现在某些情况下可能取决于何时未建立视觉树,因此ContentPresenters将没有子树。 (实际上,这种情况本身可能是一个错误,但是尽管如此,该代码还是可靠的。)

相关问题