第八章 用户界面(三)

在 F# 中使用 Visual Studio 窗体设计器

到现在,F# 还没有自己的窗体设计器;然而,由于 .NET 具有很强的互操作性,因此,很容易在 F# 中使用由 Visual Studio 设计器创建的窗体。有两种选择:第一,创建一个 F# 库,然后,在自己的 Windows 窗体中调用这个库中的函数;第二;创建一个窗体库,然后,在 F# 应用程序中使用。下面分别讨论这两种方法,并对比它们的优势与不足;示例都是计算斐波那契数列(Fibonacci),如图
8-4。

警告

本书是有关 F# 的,对于书中的主要素材,并不需要任何其他编程语言知识。然而,这一主题,需要有一点点 .NET 编程语言的知识,即,C#;具体来说,在这一节会有两个很短的 C# 程序。当然,如果你愿意,也很容易用 Visual Basic .NET 代码替换 C#。

图 8-4 用 Visual Studio 设计器创建计算斐波那契数列窗体

创建能够在窗体中使用的 F # 库,主要考虑因素是要使库很方便地在窗体中使用。这里,我们创建一个计算斐波那契数列函数,它有一个整数参数,返回的也是整数。这样事情就简单了,因为窗体在使用 .NET 整数类型方面没有任何问题。为了让这个库更有效,还要创建一个斐波那契数列的延迟(lazy)列表,并定义一个函数,取第 n 个数:

module Strangelights.Fibonacci

//an infinite sequence of Fibonacci numbers

let fibs =

(0, 1) |> Seq.unfold

(fun (n0, n1)
->

Some(n0, (n1, n0 + n1)))

// afunction to get the nth fibonacci number

let get n =

Seq.nth n fibs

[

(0,1) |> Seq.unfold

原文这里是(1,1),应该是笔误。

]

很容易在窗体上使用这个函数,只需要在 Visual Studio 窗体项目中引用这个 F# 的 .dll。如果是一个 C# 类,可以通过导入 Strangelights 命名空间,使用模块 Strangelights.Fibonacci,这样 Fibonacci 就好像是 C# 中的一个类。下面的例子演示了如何在 C# 中调用这个函数,并把结果放到控件上。注意,因为这个窗体是用 Visual Studio 2005 创建的,控件定义放在一个单独的源文件中:

using System;

usingSystem.Windows.Forms;

using Strangelights;

namespace CSAPP

{

public
partial class
FibForm : Form

{

public FibForm()

{

InitializeComponent();

}

private
void calculate_Click(object sender,
EventArgs e)

{

// convert input toan integer

int n =
Convert.ToInt32(input.Text);

// caculate theapropreate fibonacci number

n = Fibonacci.get(n);

// display result touser

result.Text = n.ToString();

}

}

}

[

以下是第二种方法:

]

如果你想从 F# 中使用以 C# 创建的窗体,需要把特定的控件公开为属性;并不需要公开所有的控件,只是那些需要与 F# 进行交互的控件。下面的例子演示如何用 C# 实现;另外,由设计器生成的所有代码都隐藏在一个单独的文件中:

using System;

usingSystem.Windows.Forms;

namespace Strangelights.Forms

{

public
partial class
FibForm : Form

{

// publicconstructor for the form

public FibForm()

{

InitializeComponent();

}

// expose thecalculate button

public
Button Calculate

{

get {
return calculate; }

}

// expose theresults label

public
Label Result

{

get {
return result; }

}

// expose the inputstext box

public
TextBox Input

{

get {
return input; }

}

}

}

后面的事情就很简单了,从 F# 中引用这个 C# 的 .dll,创建窗体的实例,然后使用。下面例子的代码就是这样做的:

openSystem.Windows.Forms

open Strangelights.Forms

//an infinite sequence of Fibonacci numbers

let fibs =

(0, 1) |> Seq.unfold

(fun (n0, n1)
->

Some(n0, (n1, n0 + n1)))

// afunction to get the nth fibonacci number

let getFib n =

Seq.nth n fibs

let form =

// create a new instance of the form

let temp =
new FibForm()

// add an event handler to the form‘s click event

temp.Calculate.Click.Add

(fun _
->

// convert input to an integer

let n = int temp.Input.Text

// caculate the apropreate fibonacci number

let n = getFib n

// display result to user

temp.Result.Text <- string n)

temp

Application.Run(form)

可以看到,这两种技术得到的结果是相似的,那么,问题就来了:什么情况下用哪一个更好呢?在 C# 窗体中调用 F# 的问题,是不可避免地要写相当多的 C# 代码,才能把一切连到一起。另外,在 C# 中使用一些F# 类型是很困难,比如,联合类型。基于这两点,我通常是写一个 C# 库,供 F# 使用。在第十四章我们将讨论写 F# 库供其他 .NET 语言使用。

第八章 用户界面(三),布布扣,bubuko.com

时间: 2024-10-25 00:25:16

第八章 用户界面(三)的相关文章

第八章 用户界面(二)

在 WinForm 上使用控件 控件就是类,派生自 System.Windows.Forms.Control,由此类派生出的任何类都能显示在窗体上,只要将它添加到窗体对象的 Controls 集合中. 现在我们看一下用控件画树形的方法.WinForms 库定义了 TreeView 类,这是专门用于显示树形结构的:自然,我们就用这个控件来显示树.使用 TreeView,需要创建它的实例,并设置属性.调用方法,对它进行配置.最重要的,是将需要显示的结点添加到 Nodes 集合中.这个控件准备好以后,

第八章 用户界面(四)

处理 WinForms 事件和事件模块 在第七章我们讨论过事件(Event)模块,它能够用于处理 WinForms 中的事件.当处理 WinForms 中的事件时,通常会遇到没有完全符合想要事件的情况.例如,当鼠标的左.右键单击时会触发MouseButton 事件,但是,我们可能只希望它响应鼠标左键的单击.这时,用 Event.filter 函数可能会很有用,用它创建一个新的事件,只响应鼠标左键的单击.看下面例子的演示: openSystem.Windows.Forms let form = /

第八章 用户界面(一)

在这一章,我们将学习程序员最重要的任务之一:把像素放到屏幕上艺术.在 F# 中,所要做的就是调用库和 API,在这方面有很多选择,因为有了 .NET 平台,就更加多样.第一个选择是要确定是想创建桌面应用程序,它运行在本地,用一系列窗口和控件把信息显示给用户:还是想创建网站应用程序,应用程序的界面用 HTML 定义,然后,通过浏览器渲染. 用 .NET 创建桌面应用程序,可以有四种选择:WinForms.Windows Presentation Foundation (WPF,[ 原文这里有笔误

第三十八章

上德不德,是以有德:下德不失德,是以无德.上德无为而无以为也.上仁为之而无以为也:上义为之而有以为也.上礼为之而莫之应也,则攘臂而扔之.故失道而后德,失德而后仁,失仁而后义,失义而后礼.夫礼者,忠信之薄也,而乱之首也.前识者,道之华也,而愚之首也.是以大丈夫居其厚,不居其薄,居其实,不居其华.故去彼取此. 第三十八章1 想索取回报的行善,是“无德” 上德不德,是以有德:下德不失德,是以无德. (第三十七章 第3讲) 真正修行高的人,不会以“德”的名义去做事,不会标榜自己的德行,这是真正的“有德”

致初入职场的兄弟姐妹

致初入职场的兄弟姐妹   我很喜欢电影<燃情岁月>中的那句台词--"有些人能够听见自己内心的声音,非常的清楚,他们依循着自己的内心来行事.这些人变得疯狂,或者成为传奇--"(Some people hear their own inner voices with great clearness and they live by what they hear. Such people become crazy, or they become legends. )     这是

3D Game Programming with directx 11 习题答案 8.3

第八章 第三题 1.将flare.dds和flarealpha.dds拷贝到工程目录 2.创建shader resource view HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice, L"Textures/flare.dds", 0, 0, &mFlareSRV, 0)); HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice, L"Textures/fla

Java 线程第三版 第八章 Thread与Collection Class 读书笔记

JDK1.2引入最有争议性的改变是将集合类默认为不是Thread安全性的. 一.Collection Class的概述 1. 具有Threadsafe 的Collection Class: java.util.Vector(List) 列表集合,通过索引操作. java.util.Stack(List) 继承自Vector,提供LIFO的顺序操作push进入,pop出元素. java.util.Hashtable(Map) 一个简单.无序的key与value的映射. java.util.conc

Gradle 1.12用户指南翻译——第三十八章. Eclipse 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userg

Python django框架笔记(三):django工作方式简单说明和创建用户界面

(一)  说明 简单说明下django的工作方式,并举2个例子. (二)  Django工作方式 假定我们有下面这些文件 ,这里在前2篇的基础上增加了 templates目录(存放html文件) 和static目录(存放图片JS.css等) (三)   实现一个完整的用户界面 #假设已经创建好了项目和应用.下面URLconf和视图函数没什么先后关系,根据自己喜好,你可以先写视图函数,也可以先定义URLconf. 有下面几个步骤 (1)   创建模型 (2)   定义项目的URLconf(mysi