首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ScrollViewer + Grid和VisualTreeHelper.GetChildrenCount()

WPF ScrollViewer + Grid和VisualTreeHelper.GetChildrenCount()
EN

Stack Overflow用户
提问于 2022-04-19 02:52:51
回答 1查看 72关注 0票数 0

因此,我试图从父控件(MainGrid)获取所有控件,为此我使用以下方法:

代码语言:javascript
复制
            public static List<Visual> GetChildrens(Visual iParent, bool iRecursive)
            {
                List<Visual> result = new List<Visual>();

                iParent.Dispatcher.Invoke((Action)(() =>
                {
                    if (iRecursive)
                    {
                        Queue<Visual> toCheck = new Queue<Visual>();

                        toCheck.Enqueue(iParent);

                        while (toCheck.Count > 0)
                        {
                            for (int j = 0; j < VisualTreeHelper.GetChildrenCount(toCheck.Peek()); j++)
                            {
                                Visual childVisual = (Visual)VisualTreeHelper.GetChild(toCheck.Peek(), j);

                                toCheck.Enqueue(childVisual);
                                result.Add(childVisual);
                            }

                            toCheck.Dequeue();
                        }
                    }
                    else
                    {
                        for (int j = 0; j < VisualTreeHelper.GetChildrenCount(iParent); j++)
                        {
                            Visual childVisual = (Visual)VisualTreeHelper.GetChild(iParent, j);
                            result.Add(childVisual);
                        }
                    }
                }));

                return result;
            }

它适用于ScrollViewer网格、StackPanelStackPanel + GridScrollViewerE 210,但不适用于E 113网格<代码>E 214

代码语言:javascript
复制
    <Grid x:Name="MainGrid">
        <ScrollViewer>
            <Grid>
                <Label Content="Pizza0" x:Name="Test0_Localize_Content" />
                <!--Don't work-->
            </Grid>
        </ScrollViewer>

        <ScrollViewer x:Name="SVName">
            <Grid>
                <Label Content="Pizza1" x:Name="Test1_Localize_Content" /> 
                <!--Don't work-->
            </Grid>
        </ScrollViewer>

        <ScrollViewer>
            <Label Content="Pizza0" x:Name="Test0_Localize_Content" />
            <!--Work-->
        </ScrollViewer>

        <Grid>
            <Grid>
                <Label Content="Pizza2" x:Name="Test2_Localize_Content" /> 
                <!--Work-->
            </Grid>
        </Grid>

        <StackPanel>
            <Grid>
                <Label Content="Pizza3" x:Name="Test3_Localize_Content" /> 
                <!--Work-->
            </Grid>
        </StackPanel>
    </Grid>

我不明白的是什么?(所以发布我的问题“看起来你的文章主要是代码,请添加更多细节”)所以:我如何修复它,什么是我不明白的是WPF和c#。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-19 05:59:06

ScrollViewer控件没有子元素的定义,因为它只能包含一个元素。

要获得ScrollViewer的子级,您必须检查其内容。

对代码的最简单修改是:

代码语言:javascript
复制
while (toCheck.Count > 0)
{
    if(toCheck.Peek() is ScrollViewer)  
    {
        ScrollViewer scroll = toCheck.Peek() as ScrollViewer;
        if(scroll.Content is not null)
        {
            toCheck.Enqueue(scroll.Content as Visual);
            result.Add(scroll.Content as Visual);
        }
    }
    else
    {
        for (int j = 0; j < VisualTreeHelper.GetChildrenCount(toCheck.Peek()); j++)
        {
            Visual childVisual = (Visual)VisualTreeHelper.GetChild(toCheck.Peek(), j);

            toCheck.Enqueue(childVisual);
            result.Add(childVisual);
        }
    }

    toCheck.Dequeue();
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71919155

复制
相关文章

相似问题

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