简答:在程序末尾添加以下行:
System.Windows.Forms.Application.Run()
长答案:
图表确实被创建了,但它立即消失了,因为您的程序在创建图表后立即退出。这不会发生在 Visual Studio 的 F# 交互窗口中,因为 F# 交互窗口不会在执行程序后立即关闭 - 它只是挂在那里,等待您提交更多代码以执行。
为了让你的程序不会立即退出,你可以实现一些等待机制,比如等待一段时间(见System.Threading.Thread.Sleep)或者等待用户回车(通过stdin.ReadLine()),等等
但是,这实际上对您没有帮助,因为还有下一个问题:图表是通过 Windows 窗体绘制的,它依赖于 message loop 运行 - 否则窗口无法接收消息,因此不能t 事件绘制本身。
FSI does have its own built-in event loop,这就是您的程序在 VS 下的工作方式。但是,如果您实施“等待”机制(例如 stdin.ReadLine()),则此事件循环将被阻止 - 将无法发送消息。因此,在不干扰图表窗口功能的情况下防止程序退出的唯一明智方法是启动您自己的事件循环。这正是Application.Run() 所做的。
保存到磁盘而不显示:
(回应评论)
据我了解,FSharp.Charting 库旨在作为一种在屏幕上显示图表的快捷方式,主要用例是在 F# Interactive 中探索数据集。更具体地说,Chart 对象的一些关键属性,例如 ChartAreas 和 Series 在图表创建时不会被初始化,但只有当它显示在屏幕上时(参见 source code),如果没有这些属性,图表仍然为空。
向库提交拉取请求不足,我建议下拉到底层System.Windows.Forms.DataVisualization.Charting.Chart:
open System.Windows.Forms.DataVisualization.Charting
let ch = new Chart()
ch.ChartAreas.Add( new ChartArea() )
let s = new Series( ChartType = SeriesChartType.Line )
s.Points.DataBind( [for x in 1..10 -> x, x*x], "Item1", "Item2", "" )
ch.Series.Add s;
ch.SaveImage(@"C:\Temp\chart.png", System.Drawing.Imaging.ImageFormat.Png)