標籤:style color 使用 io for art html 代碼
在wpf中尋找控制項要用到VisualTreeHelper類,但這個類並沒有按照名字尋找控制項的方法,於是搜尋網路,整理出下面這個類,感覺用起來很是方便。
貼出來,供大家參考。
/// <summary> /// WPF/Silverlight 尋找控制項擴充方法 /// </summary> public static class VisualHelperTreeExtension { /// <summary> /// 根據控制項名稱,尋找父控制項 /// elementName為空白時,尋找指定類型的父控制項 /// </summary> public static T GetParentByName<T>(this DependencyObject obj, string elementName) where T : FrameworkElement { DependencyObject parent = VisualTreeHelper.GetParent(obj); while (parent != null) { if ((parent is T) && (((T)parent).Name == elementName || string.IsNullOrEmpty(elementName))) { return (T)parent; } parent = VisualTreeHelper.GetParent(parent); } return null; } /// <summary> /// 根據控制項名稱,尋找子控制項 /// elementName為空白時,尋找指定類型的子控制項 /// </summary> public static T GetChildByName<T>(this DependencyObject obj, string elementName) where T : FrameworkElement { DependencyObject child = null; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { child = VisualTreeHelper.GetChild(obj, i); if (child is T && (((T)child).Name == elementName) || (string.IsNullOrEmpty(elementName))) { return (T)child; } else { T grandChild = GetChildByName<T>(child, elementName); if (grandChild != null) { return grandChild; } } } return null; } /// <summary> /// 根據控制項名稱,尋找子控制項集合 /// elementName為空白時,尋找指定類型的所有子控制項 /// </summary> public static List<T> GetChildsByName<T>(this DependencyObject obj, string elementName) where T : FrameworkElement { DependencyObject child = null; List<T> childList = new List<T>(); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { child = VisualTreeHelper.GetChild(obj, i); if (child is T && (((T)child).Name == elementName) || (string.IsNullOrEmpty(elementName))) { childList.Add((T)child); } else { List<T> grandChildList = GetChildsByName<T>(child, elementName); if (grandChildList != null) { childList.AddRange(grandChildList); } } } return childList; } }
使用的時候非常簡單,比如尋找datagrid裡模板列的一個叫“myTextBox”的文字框,可以這樣寫:
var child = dataGrid.GetChildByName<TextBox>("myTextBox"); if (child != null) { child.Text = "abc"; }
注意:初期化頁面的時候,如果尋找控制項的代碼放在Loaded事件中,會找不到控制項;應該放在LayoutUpdated事件中,這時候xaml已經載入完畢,所有的子控制項才能取到。
但是LayoutUpdated事件只要頁面有更新,它都會觸發,如果要達到Loaded事件的效果,我們可以設定一個flag在控制碼只在初期化時執行一次,現在也沒有想到更好的辦法來實現,大概如下:
bool firstLoad = true; private void UserControl_LayoutUpdated(object sender, EventArgs e) { if (firstLoad) { //第一次載入要執行的代碼 //... firstLoad = false; } }