亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# WPF 父控件通過使用可視化樹找到子控件的示例代碼

2019-10-29 19:59:32
字體:
來源:轉載
供稿:網友

在我們使用WPF設計前臺界面時,經常會重寫數據模板,或者把控件放到數據模板里。但是一旦將控件放到數據模板中,在后臺就沒有辦法通過控件的名字來獲取它了,更沒辦法對它進行操作(例如,隱藏,改變控件的某個值)。

如果你是比我還白的小白,對我剛剛陳述的東西不清楚,接下來我簡單說一下什么是把控件放在數據模板中,怎么樣的情況沒法后臺通過名字來獲取控件,如果讀者對于數據模板這些事兒已經清楚了,或者只關心如何使用可視化樹可以將這部分跳過哈。

先上代碼介紹一下什么是數據模板以WPF中ListBox控件為例:

<ListBox Name="ListBox_1" HorizontalAlignment="Left" Height="299" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" MouseDoubleClick="ListBox_1_OnMouseDoubleClick">    <ListBox.ItemTemplate>      <DataTemplate>        <Button Name="Button_1" Content="666"></Button>      </DataTemplate>    </ListBox.ItemTemplate></ListBox>

我在后臺設置了顯示了8行item,效果如下:

C#,WPF,父控件,可視化樹,子控件,代碼

我們可以看到重寫數據模板實現的效果是在ListBox的每一項Item都是一個Button,這里介紹的只是一些簡單應用例子,重寫模板是很強大的。因為如果用到可視化樹多半是因為使用了數據模板在后臺用名字無法找到相應控件了,所以在此簡單介紹一下,方便理解。

接下來我們在后臺嘗試通過控件的名字來找到我們的ListBox和Button

C#,WPF,父控件,可視化樹,子控件,代碼

C#,WPF,父控件,可視化樹,子控件,代碼

我們發現通過控件的名字可以找到ListBox但是通過button的名字卻無法找到button,這就是數據模板搞的鬼。

但是沒有關系,我們可以通過可視化樹從ListBox里找到它的子控件我們想要的這個Button。

重點來了,先上代碼,可視化樹通過父控件找到它的子控件:

List<T> FindVisualChild<T>(DependencyObject obj) where T : DependencyObject    {      try      {        List<T> list = new List<T>();        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)        {          DependencyObject child = VisualTreeHelper.GetChild(obj, i);          if (child is T)          {            list.Add((T)child);            List<T> childOfChildren = FindVisualChild<T>(child);            if (childOfChildren != null)            {              list.AddRange(childOfChildren);            }          }          else          {            List<T> childOfChildren = FindVisualChild<T>(child);            if (childOfChildren != null)            {              list.AddRange(childOfChildren);            }          }        }        return list;      }      catch (Exception)      {        //MessageBox.Show(ee.Message);        return null;      }    }

先將上面的方法復制到你的項目當中,此時對于可視化樹的應用已經完成一半了。

接下來上代碼,通過可視化樹雙擊ListBox的ltem把對應的button的Content值從666改成777:

C#,WPF,父控件,可視化樹,子控件,代碼

private void ListBox_1_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)    {      ListBoxItem myListBoxItem = (ListBoxItem)ListBox_1.ItemContainerGenerator.ContainerFromItem(ListBox_1.SelectedItem);      List<Button> btnList = FindVisualChild<Button>(myListBoxItem);      foreach (var item in btnList)      {        item.Content = "777";      }    }

效果就是雙擊哪個item哪個item中的button從666變成了777。

我們通過父控件找到了里面的子控件button,我們便可以對它進行任何操作(和用名字找到是一樣的)。

以上關于可視化樹的代碼可以應用于ListBox,DataGrid,ListView,TreeView,對于“.ItemContainerGenerator.ContainerFromItem”這段代碼的含義我暫時不是很理解,歡迎指教和交流。

通過以上的例子相信讀者已經可以使用可視化樹找到相應的控件了,但在我的開發過程中曾遇到過一些問題,和對于使用可視化樹的一點小建議。

1.如果你在使用可視化樹執行“ListBoxItem myListBoxItem = (ListBoxItem)ListBox_1.ItemContainerGenerator.ContainerFromItem(ListBox_1.SelectedItem);”這句返回值是空(實際上不是空),可能是因為界面沒有初始化完畢,我的理解是,在前臺這個控件還沒生成完畢,或者是你修改了值但前臺還沒有修改,可以加上這句:

控件名.UpdateLayout();

之后在使用可視化樹,這一條的說法和形容可能有點不嚴謹,歡迎指正交流。

2.可視化樹使用的是遞歸的方法,所以它的效率不是很高,如果在程序中大量使用可視化樹,會使得程序變慢的。

3.調用可視化樹返回的列表如果沒有找到相應的控件或是異常便會返回空值,所以建議在你遍歷可視化樹返回的列表時,請先判斷否非為空。

補充:WPF查找子控件和父控件方法

一、查找某種類型的子控件,并返回一個List集合public List<T> GetChildObjects<T>(DependencyObject obj, Type typename) 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).GetType() == typename)){childList.Add((T)child);}childList.AddRange(GetChildObjects<T>(child,typename));}return childList;}調用:List<Button> listButtons = GetChildObjects<Button>(parentPanel, typeof(Button)); //parentPanel就是xaml里定義的控件的x:name二、通過名稱查找子控件,并返回一個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).GetType() == name |string.IsNullOrEmpty(name))){childList.Add((T)child);}childList.AddRange(GetChildObjects<T>(child,name));}return childList;}調用:List<Button> listButtons = GetChildObjects<Button>(parentPanel, "button1");三、通過名稱查找某子控件: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;}}returnnull;}調用:StackPanel sp = GetChildObject<StackPanel>(this.LayoutRoot, "spDemoPanel");四、通過名稱查找父控件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);}returnnull;}調用:Grid layoutGrid = VTHelper.GetParentObject<Grid>(this.spDemoPanel, "LayoutRoot");

總結

以上所述是小編給大家介紹的C# WPF 父控件通過使用可視化樹找到子控件,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人情趣片在线观看免费| 亚洲精品国产suv| 久久久久久高潮国产精品视| 91精品国产91久久久久久久久| 日韩女优人人人人射在线视频| 日韩在线观看免费高清完整版| 亚洲最新av网址| 亚洲高清福利视频| 成人黄在线观看| 久久免费视频这里只有精品| 日韩av最新在线观看| 国产精品91久久久久久| 高潮白浆女日韩av免费看| 亚洲福利视频专区| 亚洲欧洲激情在线| 91沈先生在线观看| 精品国产福利在线| 91在线视频九色| 欧美日本黄视频| 热久久美女精品天天吊色| 欧美在线亚洲一区| 国外成人免费在线播放| 51精品国产黑色丝袜高跟鞋| 日韩成人av在线| 欧美高清在线播放| 欧美另类极品videosbestfree| 美女福利精品视频| 精品动漫一区二区| 国产精品人成电影在线观看| 欧美性猛xxx| 欧美性猛交xxxx| 青青草99啪国产免费| 亚洲第一免费播放区| 欧美肥婆姓交大片| 成人性生交xxxxx网站| 亚洲天堂第二页| 欧美成人精品不卡视频在线观看| 91在线观看免费观看| 国产精品99一区| 久久久视频在线| 91久久久久久久久久久久久| 欧美日韩国产一区二区三区| 91九色在线视频| 亚洲aⅴ日韩av电影在线观看| 国产色视频一区| 91网在线免费观看| 久久精品小视频| 国产香蕉97碰碰久久人人| 成人免费福利视频| 欧美大秀在线观看| 另类天堂视频在线观看| 日韩欧亚中文在线| 亚洲影院色在线观看免费| 亚洲精品电影网| 欧美高清第一页| 亚洲精品一区在线观看香蕉| 亚洲第一区第二区| 欧美午夜精品在线| 黑人巨大精品欧美一区二区一视频| 亚洲区免费影片| 国产乱人伦真实精品视频| 国产成人精品久久二区二区91| 亚洲片av在线| 92版电视剧仙鹤神针在线观看| 久久精品国产亚洲一区二区| 欧美精品video| 91久久久在线| 欧美日韩高清区| 久热99视频在线观看| 成人激情春色网| 成人激情av在线| 午夜精品www| 精品国产拍在线观看| 秋霞成人午夜鲁丝一区二区三区| 久久中文字幕在线| 欧美电影在线免费观看网站| 91在线色戒在线| 亚洲最大av网| 97在线看免费观看视频在线观看| 中文字幕精品一区久久久久| 国产精品三级美女白浆呻吟| 38少妇精品导航| 成人国产精品日本在线| 日本精品一区二区三区在线播放视频| 欧美电影在线免费观看网站| 欧美国产第一页| 亚洲女人初尝黑人巨大| 色综合久久中文字幕综合网小说| 欧美另类交人妖| 亚洲日韩欧美视频| 亚洲第一色中文字幕| 欧美电影在线观看完整版| 中文日韩在线视频| 日韩最新中文字幕电影免费看| 美女av一区二区三区| 欧美性猛交99久久久久99按摩| 日本精品性网站在线观看| 欧美激情国产日韩精品一区18| 欧美影院成年免费版| 亚洲网站在线播放| 懂色av中文一区二区三区天美| 在线电影av不卡网址| 国内精品久久久久伊人av| 国产成人综合精品在线| 国产精品福利在线| 国产一区私人高清影院| 中文字幕日韩欧美| 人人做人人澡人人爽欧美| 中文字幕亚洲在线| 亚洲天堂免费观看| 国产一区二区色| 国产视频自拍一区| 久久久亚洲精选| 韩国美女主播一区| 欧美性猛交丰臀xxxxx网站| 久久久999国产| 亚洲国产精品高清久久久| 在线电影av不卡网址| 亚洲精品乱码久久久久久金桔影视| 久久在精品线影院精品国产| 午夜精品www| 97精品在线观看| 精品女同一区二区三区在线播放| 欧美激情视频三区| 日韩美女免费视频| 日韩av免费观影| 91午夜在线播放| 欧美精品999| 亚洲欧美中文日韩v在线观看| 日韩精品高清在线观看| 久久国内精品一国内精品| 日韩视频永久免费观看| 91高清视频免费观看| 国产主播喷水一区二区| 亚洲欧洲日韩国产| 日韩av中文字幕在线| 亚洲网站在线看| 亚洲永久免费观看| 国产精品男女猛烈高潮激情| 2018日韩中文字幕| 久久伊人91精品综合网站| 日韩精品极品视频| 亚洲精品720p| 色婷婷亚洲mv天堂mv在影片| 欧美中文在线视频| 国产成人精品999| 久久天天躁狠狠躁夜夜爽蜜月| 国产69精品99久久久久久宅男| 一区二区三区国产视频| 亚洲乱码一区二区| 亚洲品质视频自拍网| 欧美另类69精品久久久久9999| 91久久久在线| 宅男66日本亚洲欧美视频| 久久久久久一区二区三区| 日韩视频永久免费观看| 久久久成人的性感天堂| 欧美日韩在线影院| 欧美最近摘花xxxx摘花| 亚洲第一页中文字幕| 亚洲福利视频久久| 日韩视频第一页| 亚洲a级在线播放观看| 欧美乱大交做爰xxxⅹ性3|