using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
namespace CustomUI.Utils
{
public class VisualHelper
{
///
/// 查找元素的子元素
///
/// 子元素类型
///
///
public static T FindVisualChild(DependencyObject obj) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T)
return (T)child;
else
{
T childOfChild = FindVisualChild(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
///
/// 得到指定元素的集合
///
///
///
///
public static IEnumerable FindVisualChildren(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(child))
{
yield return childOfChild;
}
}
}
}
///
/// 利用visualtreehelper寻找对象的子级对象
///
///
///
///
public static List FindVisualChildrenEx(DependencyObject obj) where T : DependencyObject
{
try
{
List TList = new List { };
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T)
{
TList.Add((T)child);
List childOfChildren = FindVisualChildrenEx(child);
if (childOfChildren != null)
{
TList.AddRange(childOfChildren);
}
}
else
{
List childOfChildren = FindVisualChildrenEx(child);
if (childOfChildren != null)
{
TList.AddRange(childOfChildren);
}
}
}
return TList;
}
catch (Exception e)
{
return null;
}
}
///
/// 查找元素的父元素
///
///
///
///
public static T FindParent(DependencyObject i_dp) where T : DependencyObject
{
DependencyObject dobj = (DependencyObject)VisualTreeHelper.GetParent(i_dp);
if (dobj != null)
{
if (dobj is T)
{
return (T)dobj;
}
else
{
dobj = FindParent(dobj);
if (dobj != null && dobj is T)
{
return (T)dobj;
}
}
}
return null;
}
public static T FindParent(DependencyObject i_dp, string elementName) where T : DependencyObject
{
DependencyObject dobj = (DependencyObject)VisualTreeHelper.GetParent(i_dp);
if (dobj != null)
{
if (dobj is T && ((System.Windows.FrameworkElement)(dobj)).Name.Equals(elementName))
{
return (T)dobj;
}
else
{
dobj = FindParent(dobj);
if (dobj != null && dobj is T)
{
return (T)dobj;
}
}
}
return null;
}
///
/// 查找指定名称的元素
///
/// 元素类型
///
/// 元素名称,及xaml中的Name
///
public static childItem FindVisualElement(DependencyObject obj, string elementName) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem && ((System.Windows.FrameworkElement)(child)).Name.Equals(elementName))
return (childItem)child;
else
{
IEnumerator j = FindVisualChildren(child).GetEnumerator();
while (j.MoveNext())
{
childItem childOfChild = (childItem) j.Current;
if (childOfChild != null && !(childOfChild as FrameworkElement).Name.Equals(elementName))
{
FindVisualElement(childOfChild, elementName);
}
else
{
return childOfChild;
}
}
}
}
return null;
}
///
/// 命中测试。根据当前选中元素,查找视觉树父节点与子节点,看是否存在指定类型的元素
///
/// 想命中的元素类型
/// 当前选中元素
/// true:命中成功
public static bool HitTest(DependencyObject dp) where T : DependencyObject
{
return FindParent(dp) != null || FindVisualChild(dp) != null;
}
public static T FindEqualElement(DependencyObject source, DependencyObject element) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(source); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(source, i);
if (child != null && child is T && child == element)
{
return (T)child;
}
else
{
T childOfChild = FindVisualChild(child);
if (childOfChild != null)
{
return childOfChild;
}
}
}
return null;
}
}
}