WPF ScrollViewer + 网格和 VisualTreeHelper.GetChildrenCount()

WPF ScrollViewer + Grid and VisualTreeHelper.GetChildrenCount()

所以我试图从父控件 (MainGrid) 获取所有控件,我使用它:

            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;
            }

它适用于 GridStackPanelStackPanel + Grid, ScrollViewer 但不要使用 ScrollViewer + Grids:

    <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>

我不明白什么? (所以对于 post 我的问题“看起来你的 post 主要是代码;请添加更多详细信息”)所以:我如何修复它,我不明白它是 WPF 和 C#。

ScrollViewer 控件没有子项定义,因为它只能容纳一个元素。

要获取 ScrollViewer 的子项,您必须检查其内容。

最简单的代码修改是:

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();
}