WPF中尋找控制項的擴充類

來源:互聯網
上載者:User

標籤: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;            }        }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.