IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:51:08  更:2021-08-27 11:52:24 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码