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 的匿名类型来表示照片信息。
原文地址:http://blog.csdn.net/hadstj/article/details/42776863