WPF查找可视化树的控件名称
1.查找Visual级别控件类型名称
public List<Visual> FindVisualChildren(DependencyObject dpObj)
{
List<Visual> childrenList = new List<Visual>();
int childrenCount = VisualTreeHelper.GetChildrenCount(dpObj);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(dpObj, i) as Visual;
if (child != null)
{
childrenList.Add(child);
childrenList.AddRange(FindVisualChildren(child));
}
}
return childrenList;
}
public void ShowAllVisual()
{
List<Visual> visualsList = FindVisualChildren(rootGrid);
foreach (var visual in visualsList)
{
Console.WriteLine(visual.GetType().Name);
}
}
2、查找FrameworkElement级别控件名称
public List<(string TypeName, string InstanceName)> FindVisualChildrenWithNames(DependencyObject dpObj)
{
List<(string, string)> childrenList = new List<(string, string)>();
int childrenCount = VisualTreeHelper.GetChildrenCount(dpObj);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(dpObj, i);
if (child == null) continue;
if (child is FrameworkElement frameworkElement)
{
string typeName = child.GetType().Name;
string instanceName = frameworkElement.Name;
childrenList.Add((typeName, string.IsNullOrEmpty(instanceName) ? "(未设置x:Name)" : instanceName));
}
else
{
childrenList.Add((child.GetType().Name, "(不支持x:Name)"));
}
childrenList.AddRange(FindVisualChildrenWithNames(child));
}
return childrenList;
}
public void ShowAllVisualWithNames()
{
var visualsList = FindVisualChildrenWithNames(rootGrid);
foreach (var (typeName, instanceName) in visualsList)
{
Console.WriteLine($"控件类型:{typeName} → 实例名(x:Name):{instanceName}");
}
}
浙公网安备 33010602011771号