| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> WPF控件分类(三) -> 正文阅读 |
|
[人工智能]WPF控件分类(三) |
1.1 ItemsControl族 本族元素的特点如下: 均派生自ItemsControl类。 它们都是控件,用于显示列表化的数据。 内容属性为Items或ItemsSource。 每种ItemsControl都对应有自己的条目容器(Item Container)。 本族的包含控件如表所示: ? ListBox是个典型的ItemsControl,下面将以它为例,研究一下ItemsControl。 首先,我们看看ListBox的自动包装。WPF的ListBox在显示功能上比Winform Form或 者ASP.NET的ListBox要强大很多。传统的ListBox只能将条目以字符串的形式显示,而 WPF的ListBox除了可以显示中规中矩的字符串条目还能够显示更多的元素,如 CheckBox、Button、RadioButton、TextBox等,这样一来,我们就能制作出更加丰富的 UI。代码例子如下: <Grid> <ListBox?Margin="5"> <CheckBox?x:Name="checkBoxTim"?Content="Tim"/> <CheckBox?x:Name="checkBoxTom"?Content="Tim"/> <CheckBox?x:Name="checkBoxBruce"?Content="Bruce"/> <Button?x:Name="buttonMess"?Content="Mess"/> <Button?x:Name="buttonOwen"?Content="Owen"/> <Button?x:Name="buttonVictor"?Content="Victor"/> <Image?Source="Images/png-0176.ico"/> </ListBox> </Grid> ? ? 表面看上去是ListBox直接包含了一些CheckBox和Button,实际上并非这样。我们为 Victor这个按钮添加Click事件的响应,看看它的父级容器是什么。 private void?buttonVictor_Click(object sender, RoutedEventArgs e) { Button btn = sender?as?Button; DependencyObject level1 = VisualTreeHelper.GetParent(btn); DependencyObject level2 = VisualTreeHelper.GetParent(level1); DependencyObject level3 = VisualTreeHelper.GetParent(level2); MessageBox.Show(level3.GetType().ToString()); } 单击按钮,弹出消息框如图: ? ? 前面我们知道,WPF的UI是树形结构,VisualTreeHelper类就是帮助我们在这棵由可 视化元素构成的树上进行导航的辅助类。我们沿着被单击的Button一层一层向上找,找 到第三层发现他是一个ListBoxItem。ListBoxItem就是ListBox对应的Item Container,也就 是说,无论你把什么样的数据集合交给ListBox,它都会以这种方式进行自动包装。所以我 们完全没必要这样写: <Grid> <ListBox?Margin="5"> <Image?Source="Images/png-0176.ico"/> <ListBoxItem> <Button?x:Name="buttonMess"?Content="Mess"/> </ListBoxItem> <ListBoxItem> <Button?x:Name="buttonOwen"?Content="Owen"/> </ListBoxItem> <ListBoxItem> <Button?x:Name="buttonVictor"?Content="Victor" Click="buttonVictor_Click"/> </ListBoxItem> </ListBox> </Grid> 上面这个例子是单纯地为了说明ItemsControl能够使用对应的Item Container自动包装数 据。实际工作中,除非列表里的元素自始至终都是固定的我们才使用直接把UI元素作为 ItemsControl内容的方法,比如一年有十二个月、一周有七天等。大多数情况 下,UI上 的列表会用于显示动态的后台数据,这时候我们交给ItemsControl的就是程序逻辑中的数 据而非控件了。 假设程序中自定义有Employee类: public?class?Employee { public?int Id {?get;?set; } public?string Name {?get;?set; } public?int Age {?get;?set; } } 并且有一个Employee类型的集合: List<Employee> empList =?new?List<Employee>() { new?Employee () { Id=1,Name="Tim", Age=18}, new?Employee () { Id=2,Name="Tom", Age=19}, new?Employee () { Id=3,Name="Guo", Age=20}, new?Employee () { Id=4,Name="Yan", Age=21}, new?Employee () { Id=5,Name="Owen", Age=22}, new?Employee () { Id=6,Name="Victor", Age=23}, }; 在程序的主界面上有一个名为listBoxEmplyee的ListBox。我们只需要这样写: private void?Window_Loaded(object sender, RoutedEventArgs e) { List<Employee> empList =?new?List<Employee>() { new?Employee () { Id=1,Name="Tim", Age=18}, new?Employee () { Id=2,Name="Tom", Age=19}, new?Employee () { Id=3,Name="Guo", Age=20}, new?Employee () { Id=4,Name="Yan", Age=21}, new?Employee () { Id=5,Name="Owen", Age=22}, new?Employee () { Id=6,Name="Victor", Age=23}, }; this.listBoxEmplyee.DisplayMemberPath =?"Name"; this.listBoxEmplyee.SelectedValue =?"Id"; this.listBoxEmplyee.ItemsSource = empList; } ? DisplayMemberPath这个属性告诉ListBox显示每条数据的那个属性,换句话说,ListBox 会去调用这个属性值的Tostring()方法,把得到的字符串放入一个TextBlock(最简单的文本 控件),然后再按照前面说的办法把TextBlock包装进一个ListBoxItem里。 ListBox的SelectedValuePath属性将与其SelectedValue属性配合使用。当你调用 SelectedValue属性时,ListBox先找到选中的Item所对应的数据对象,然后把 SelectedValuePath的值当作数据对象的属性名称并把这个属性的值取出来。 DisplayMemberPath和SelectedValuePath是两个相当简化的属性。 DisplayMemberPath只能显示简单的字符串,想用更加复杂的形式显示数据需要使用 DataTemplate。SelectedValuePath也只能返回单一的值,如果想进行一些复杂的操作, 不妨直接使用ListBox的SelectedItem和SelectedItems属性,这两个属性返回的就是数据 集合中对象,得到原始的数据对象后就任由程序员操作了。 理解了ListBox的自动包装机制之后,我们把全部ItemsControl对应的Item Container列在 下面,如表所示: ? 1.2 HeaderedItemsControl族 本族控件除了具有ItemsControl的特性外,还具显示标题的能力。元素特点如下: 均派生自HeaderedItemsControl类。 它们都是控件,用于显示列表化的数据,同时可以显示一个标题。 内容属性为Items、ItemsSource和Header。 因为与ItemsControl非常类似,在此就不浪费时间了。本族控件只有3个:MenuItem、 TreeViewItem、ToolBar。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 17:58:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |