Bry*_*hle 417
这应该可以解决问题
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)
然后你像这样枚举控件
foreach (TextBlock tb in FindVisualChildren<TextBlock>(window))
{
// do something with tb here
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*oel 63
这是最简单的方法:
IEnumerable<myType> collection = control.Children.OfType<myType>();
Run Code Online (Sandbox Code Playgroud)
其中control是窗口的根元素.
Sim*_*n F 21
我改编了@Bryce Kahle的回答来关注@Mathias Lykkegaard Lorenzen的建议并使用LogicalTreeHelper.
好像工作还可以.;)
public static IEnumerable<T> FindLogicalChildren<T> ( DependencyObject depObj ) where T : DependencyObject {
if( depObj != null ) {
foreach( object rawChild in LogicalTreeHelper.GetChildren( depObj ) ){
if( rawChild is DependencyObject ) {
DependencyObject child = (DependencyObject)rawChild;
if( child is T ) {
yield return (T)child;
}
foreach( T childOfChild in FindLogicalChildren<T>( child ) ) {
yield return childOfChild;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
(它仍然不会检查@Benjamin Berry和@David R分别提到的GroupBox中的制表符控件或网格.)(同时遵循@ noonand的建议并删除多余的孩子!= null)
Osk*_*kar 13
使用辅助类VisualTreeHelper
或LogicalTreeHelper
取决于您感兴趣的树.它们都提供了获取元素子元素的方法(尽管语法略有不同).我经常使用这些类来查找特定类型的第一个匹配项,但您可以轻松地修改它以查找该类型的所有对象:
public static DependencyObject FindInVisualTreeDown(DependencyObject obj, Type type)
{
if (obj != null)
{
if (obj.GetType() == type)
{
return obj;
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject childReturn = FindInVisualTreeDown(VisualTreeHelper.GetChild(obj, i), type);
if (childReturn != null)
{
return childReturn;
}
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
小智 9
我发现上面几个例子中使用的行VisualTreeHelper.GetChildrenCount(depObj);不会返回GroupBox的非零计数,特别是GroupBox包含Grid,Grid包含子元素.我相信这可能是因为GroupBox不允许包含多个子节点,并且它存储在其Content属性中.没有GroupBox.Children类型的属性.我确信我没有非常有效地执行此操作,但我修改了此链中的第一个"FindVisualChildren"示例,如下所示:
public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
int depObjCount = VisualTreeHelper.GetChildrenCount(depObj);
for (int i = 0; i <depObjCount; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
if (child is GroupBox)
{
GroupBox gb = child as GroupBox;
Object gpchild = gb.Content;
if (gpchild is T)
{
yield return (T)child;
child = gpchild as T;
}
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是另一个紧凑版本,具有泛型语法:
public static IEnumerable<T> FindLogicalChildren<T>(DependencyObject obj) where T : DependencyObject
{
if (obj != null) {
if (obj is T)
yield return obj as T;
foreach (DependencyObject child in LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>())
foreach (T c in FindLogicalChildren<T>(child))
yield return c;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
176102 次 |
最近记录: |