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

jv4diomz  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(115)

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

l5tcr1uw

l5tcr1uw1#

我刚刚在伦敦做了一个关于F#中的React式编程的演讲,使用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!")
w3nuxt5m

w3nuxt5m2#

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

您可以使用一流的事件组合子-下面是一个很棒的分步介绍:
Link

相关问题