在XAML中添加F#函数作为事件处理程序

5
有人知道如何在xaml文件中为控件添加F#事件处理程序吗?
2个回答

2
我刚刚在伦敦做了一个关于使用Silverlight实现大多数示例的F#响应式编程演讲。该演讲已被记录下来,并且示例也可供下载,因此这可能是一个有用的资源:
  • 请参阅我的博客{{link1:其中包含源代码、录音和幻灯片链接}}
回答你具体的问题,我认为你不能在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

基本上,您需要加载一个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 _ -> ...)

你可以使用高级事件组合器 - 这里有一个很棒的逐步介绍:

链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接