F#/ WPF事件绑定

use*_*775 4 wpf f#

如果有一种方法可以将XAML中定义的事件挂钩到成员的F#函数,我会徘徊吗?当然,我可以用图解方式来做,但它有点不方便.

Tom*_*cek 9

我想问题是你是否可以使用XAML标记将F#成员指定为事件处理程序:

<Button x:Name="btnClick" Content="Click!" Click="button1_Click" />
Run Code Online (Sandbox Code Playgroud)

据我所知,答案是否定的.

这在C#中的工作方式是事件处理程序的注册是在设计器生成的C#代码(部分类)中完成的(您可以obj在名为eg的文件的目录中看到MainForm.g.cs).F#对WPF设计器没有任何直接支持,因此无法为您生成此内容.你必须编写代码来手动附加事件处理程序(但这很容易).

我在伦敦谈论Silverlight时有一些例子.您可以实现?运算符以获得对XAML元素的良好访问:

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

   // Get button using dynamic access and register handler
   let btn : Button = this?btnClick
   do btnClick.Click.Add(fun _ -> (* ... *))
Run Code Online (Sandbox Code Playgroud)

?我使用的运营商声明是:

let (?) (this : Control) (prop : string) : 'T = // '
  this.FindName(prop) :?> 'T
Run Code Online (Sandbox Code Playgroud)