首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取ContentPresenter的孩子?

如何获取ContentPresenter的孩子?
EN

Stack Overflow用户
提问于 2010-11-12 18:38:05
回答 3查看 14.5K关注 0票数 25

使用代码,我可以获得一个内容呈现器。我想要定位其中的第一个文本框,并相应地设置焦点。

Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-12 19:11:33

您可以使用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;
    }
票数 30
EN

Stack Overflow用户

发布于 2010-11-12 18:52:44

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

Stack Overflow用户

发布于 2020-04-01 02:43:24

在我的例子中,我需要迭代放置在自定义画布上的某个基类型的所有控件,该画布正在ItemsControl中使用。

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

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

这可以防止ContentPresenter没有孩子的情况发生。我发现在某些情况下,根据调用时间的不同,可视化树可能无法建立,因此ContentPresenters将没有子级。(实际上,这种情况本身可能是一个错误,但尽管如此,事实证明这段代码是可靠的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4163754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档