所以我試圖從父控制元件(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>
我不明白什么?(所以要發布我的問題“看起來您的帖子主要是代碼;請添加更多詳細資訊”)所以:我如何修復它,我不明白它是 WPF 和 c#。
uj5u.com熱心網友回復:
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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/458840.html
