在faml中添加f#函数作为事件处理程序

时间:2010-06-28 20:38:40

标签: silverlight events xaml f#

有谁知道如何将F#事件处理程序添加到xaml文件中的控件?

2 个答案:

答案 0 :(得分:2)

我刚刚在F#(伦敦)中讨论了使用Silverlight实现大多数示例的反应式编程。谈话已被记录,样本也可供下载,因此这可能是一个有用的资源:

要回答您的具体问题,我认为您不能在XAML文件中使用通常的指定事件处理程序的方式(这可能适用于F#Silverlight应用程序,但您必须使用member代替let函数)。

但是,编写Silverlight组件的最佳方法(我能想到)就是只有一个F#Silverlight库并使用C#Silverlight应用程序。在这种情况下,您需要在代码中编写事件处理程序绑定。一个简化的例子(来自谈话中的一个样本)看起来像这样:

open System.Windows.Controls

// Dynamic invoke operator that makes accessing XAML elements easy 
// (easier than using 'FindName' explicitly in the code
let (?) (this : Control) (prop : string) : 'T = // '
  this.FindName(prop) :?> 'T // '

type MyControl() as this =
  inherit UserControl()
  do 
    let path = "/MyProject;component/MyControl.xaml"
    let uri = new System.Uri(path, UriKind.Relative)
    Application.LoadComponent(this, uri)

    // Get Button named 'TestButton' from the XAML file
    let btn : Button = this?TestButton
    // Add event handler to the button
    btn.Add(fun _ -> btn.Text <- "Clicked!")

答案 1 :(得分:1)

基本上,您需要加载xaml文件并按名称查找控件:

let w = Application.LoadComponent(new  System.Uri(
          "/twitterstream;component/Window.xaml", System.UriKind.Relative
        )) :?> Window
let b = w.FindName("buttonToggle") :?> Button

然后你可以简单地添加一个事件处理程序:

b.Click.Add(fun _ -> ...)

您可以使用一流的事件组合器 - 这是一个很好的分步介绍:

http://blogs.msdn.com/b/timng/archive/2010/05/06/f-wpf-events.aspx