Son*_*Boy 2 c# wpf controls find
我正在尝试获取给定页面上给定类型的所有控件的列表,但我遇到了问题.似乎VisualTreeHelper可能只返回已加载的控件?我尝试关闭虚拟化,但这似乎没有帮助.任何人都可以想到另一种方法来获得所有控制权或者强制加载UI以便以下方法有效吗?
我从MSDN借用了这个:
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Fre*_*lad 10
请参阅以下主题:在TabControl中查找给定类型的所有控件
陶良的回答是一个很好的解释
原因是WPF设计者想要优化TabControl的性能.假设有5个TabItem,每个TabItem包含很多子项.如果WPF程序必须构造并呈现所有子项,那么它将非常慢.但是,如果TabControl仅处理当前所选TabItem中的子项,则将保存大量内存.
您可以尝试使用逻辑树.
这是一个示例实现,看看它是否适合您
像这样用它..
List<Button> buttons = GetLogicalChildCollection<Button>(yourPage);
Run Code Online (Sandbox Code Playgroud)
GetLogicalChildCollection
public static List<T> GetLogicalChildCollection<T>(object parent) where T : DependencyObject
{
List<T> logicalCollection = new List<T>();
GetLogicalChildCollection(parent as DependencyObject, logicalCollection);
return logicalCollection;
}
private static void GetLogicalChildCollection<T>(DependencyObject parent, List<T> logicalCollection) where T : DependencyObject
{
IEnumerable children = LogicalTreeHelper.GetChildren(parent);
foreach (object child in children)
{
if (child is DependencyObject)
{
DependencyObject depChild = child as DependencyObject;
if (child is T)
{
logicalCollection.Add(child as T);
}
GetLogicalChildCollection(depChild, logicalCollection);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8103 次 |
| 最近记录: |