4.4.3 创建 Windows 应用程序
我们早先一创建了应用程序的图形用户界面,所以,已经有了创建用户界面控件的代码。不过,仍要为控件指定用户交互逻辑。
用户可以通过两个按钮控制应用程序,第一个(btnOpen)加载 CSV 文件,第二个(btnSave)将图表保存到图像文件中;还有一个 PictureBox 控件 boxChart,用来显示图表。清单 4.12 显示了如何把绘图代码连接到用户界面。
清单4.12 添加用户交互 (F#)
let openAndDrawChart(e) = [1]
letdlg = new OpenFileDialog(Filter="CSV Files|*.csv")
if(dlg.ShowDialog() = DialogResult.OK) then
letpieChart = drawChart(dlg.FileName) [2]
boxChart.Image<- pieChart <-- 显示位图
btnSave.Enabled<- true <-- 启用保存图表的按钮
let saveDrawing(e) = [3]
letdlg = new SaveFileDialog(Filter="PNG Files|*.png")
if(dlg.ShowDialog() = DialogResult.OK) then
boxChart.Image.Save(dlg.FileName) <-- 保存当前图表
[<STAThread>]
do [4]
btnOpen.Click.Add(openAndDrawChart) | 注册事件处理程序
btnSave.Click.Add(saveDrawing) |
Application.Run(mainForm)
首先,代码声明了两个函数,当用户单击打开和保存按钮时调用。打开文件,用函数 openAndDrawChart[1],这个函数首先创建 OpenFileDialog,这是 Windows Forms 类,显示标准的选择文件对话框。如果用户选择一个文件,函数调用我们早先实现的函数 drawChart[2]。调用的结果是保存在内存中的位图,可以指定给PictureBox 控件的 Image 属性。第二个函数更简单,因为不需要绘制图表,把当前显示在 PictureBox 中的图像保存到指定的文件中,文件由用户通过 SaveFileDialog 指定[3]。
我们已经讨论过执行标准的 Windows 应用程序的代码,清单 4.12 再次显示[4],是因为我们添加了两行代码。在运行应用程序之前,我们指定当用户单击 btnOpen 按钮时,应调用openAndDrawChart 函数,对第二个按钮也是类似。这是通过 Add方法,把函数注册为 Click 的事件处理程序实现的。不像在 C# 中,事件是特殊的语言构造,而F# 把事件当作是有 Add 方法的普通对象看待;F# 中的事件也有 AddHandler 和 RemoveHandler 方法,目的与C# 中的事件的 += 和 -= 运算符完全相同。我们将在第十六章详细讨论有关主题,但在大多数情况下,可以使用 Add 方法。