public class VTHelper
{
// 在實際項目中,爲滿足實際開發需求,對VisualTreeHelper的方法重新進行封裝是非常必要的。
///首先要介紹的Hleper方法是GetParentObject方法,獲取父控件方法。該方法將根據當前控件,遍歷查找其父控件是否存在。參數1是表示當前子控件名,參數2是要查詢父控件名;使用VisualTreeHelper.GetParent方法獲取當前父控件。
public T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject parent = VisualTreeHelper.GetParent(obj);
while (parent != null)
{
if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
{
return (T)parent;
}
parent = VisualTreeHelper.GetParent(parent);
}
return null;
}
//另外一個Helper方法是GetChildObject,獲取子控件方法。該方法將根據當前控件,遍歷查找其子控件是否存在。參數1是表示當前父控件名,參數2是要查詢子控件名;
public T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
T grandChild = null;
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
{
return (T)child;
}
else
{
grandChild = GetChildObject<T>(child, name);
if (grandChild != null)
return grandChild;
}
}
return null;
}
/// <summary>
/// 找出符合條件的一個子對象.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public T GetChildObjectByType<T>(DependencyObject obj) where T : FrameworkElement
{
DependencyObject child = null;
T grandChild = null;
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T )
{
return (T)child;
}
else
{
grandChild = GetChildObjectByType<T>(child);
if (grandChild != null)
return grandChild;
}
}
return null;
}
//最後介紹一個Helper方法是GetChildObjects方法,該方法將把所有子控件作爲List集合返回到客戶端。其中第一個參數是父控件參數,而第二個參數是特定子控件名稱,如果需要遍歷全部子控件,第二個參數留空即可。
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
List<T> childList = new List<T>();
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
{
childList.Add((T)child);
}
childList.AddRange(GetChildObjects<T>(child, ""));
}
return childList;
}
}