11.4.2.2 实现用户界面
来源:互联网 发布:最后的大亨 版本 知乎 编辑:程序博客网 时间:2024/06/08 17:26
11.4.2.2 实现用户界面
现在,我们已经有了关于处理照片所需要的所有数据,下面就可以添加简单的图形用户界面,使用 Windows 窗体。在清单 11.22 中,我们将创建两个控件以显示数据,代码显示选定的照片。
清单 11.22 添加照片浏览器的用户界面 (F#)
open System
open System.Windows.Forms
let main = new Form(Text="Photos",ClientSize=Size(600,300))
let pict = newPictureBox(Dock=DockStyle.Fill)
let list = newListBox(Dock=DockStyle.Left,
DataSource=files,
DisplayMember ="Name") [1]<-- 显示文件数组中的名字
list.SelectedIndexChanged.Add(fun _ –>;; <-- 处理选择的变化
letinfo = files.[list.SelectedIndex]
pict.Image <- info.Preview.Value) [2] <-- 计算延迟值
main.Controls.Add(pict)
main.Controls.Add(list)
[<STAThread>]
do Application.Run(main) [3] <-- 运行应用程序
要在列表框(ListBox)控件中显示图片列表,我们使用数据绑定[1],这是很多 .NET 控件的功能,只要控件的数据源(DataSource)指定为我们的文件数组就可以了。要指定显示的内容,设置 DataMember 属性为我们想要显示的记录成员的名字(Name)。
接下来,我们把 lambda 函数注册为列表框的 SelectedIndexChanged 事件的处理程序。当它被触发后,我们选择 ImageInfo 值,并使用 Value 属性来获取指定大小的位图。如果该位图是第一次显示,这时会重新调整大小;如果之前已经浏览过,可以立即使用缓存的结果。清单 11.22 的代码是独立的应用程序,因此,可以使用 Application.Run() 方法运行。在 F# Interactive 中,可以使用 main.Show () 来显示窗体。在图 11.2 中可以看到应用程序的运行结果。
图 11.2 照片可以从左侧的列表中选择。由于使用了延迟值,调整大小后的版本被自动缓存。
运行这个应用程序,如果使用的文件夹中包含大型图片的话,由于使用延迟所带来的差别是明显的。选择“新”照片可能需要一些时间,而如果重新浏览已经看过的照片,会立即呈现。
注意
你可能想知道,我们是否可以使用多线程来改进这个应用程序。使用多线程有两个方面的好处。首先,当用户选择文件时,可以开始计算,而不要阻止用户界面。目前,应用程序是被冻结的,直到图像调整大小之后。为此,我们可以使用异步编程技术,如 F# 异步工作流,将会在第十三章讨论。
另一个方面,应用程序可以在后台预先调整位图的大小。[操作之前]不是什么也不做,而是提前调整图片的大小,当用户单击照片时就不必等待。在第十四章我们将看到,这是相当简单的我们会看到Task<T> 类型,就像 Lazy<T> 一样,只是它不是延迟[计算],而是在后台线程计算值。
对于如何在 C# 中使用 Lazy<T> 类,实现相同的应用程序,我们确信你已经有了很好的概念,所以,本书不再讨论,你可以在本书的网站找到应用程序的源代码。在 C# 版本中,有一点很重要,如果代码在一个方法内,可以使用 C# 3.0 的匿名类型来表示照片信息。
- 11.4.2.2 实现用户界面
- 用户界面线程实现
- Swing用户界面实现“国际化”
- 轻松实现Java 用户界面编程
- MIDlets实现用户界面(GUI)编程
- Android Activity---实现一个用户界面
- Android Activity---实现一个用户界面
- 用户界面
- 用户界面
- 用户界面
- 用户界面
- 用户界面
- 用VS2005实现用户界面自动化测试
- 用VS2005实现用户界面自动化测试
- 图形用户界面的设计与实现ComboBoxExample
- 利用menu实现后台管理用户界面
- python 实现GUI(图形用户界面)编程
- 用 Visual Studio 2005 实现用户界面自动化测试
- 缺少所需的CD/DVD驱动器设备驱动程序
- 深入理解Java类加载器:Java类加载原理解析
- Weibo LBS 15年定位分析和要做的事情
- j2ee如何将url指向servlet?
- 为什么url指向目录时会重新指向index页面或者报错?
- 11.4.2.2 实现用户界面
- 清除360极速浏览器的favicon缓存
- 结构类型(struct)与机器位数不同所占用的内存空间
- MyEclipse 常用快捷键
- 游戏任务成就体系的实现(附一):任务成就服务的日志记录
- SDUT_2015寒假集训_结构体练习_A-Milk
- myeclipse项目重命名后,更改发布路径
- 项目部署文档--数据库导入,tomcat配置
- C++四种强制类型转换符