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;
}
它适用于 Grid、StackPanel、StackPanel + 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();
}
所以我试图从父控件 (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;
}
它适用于 Grid、StackPanel、StackPanel + 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();
}