2016-09-06 24 views
2

现在我有一个Custom Routed Event,我该如何在XAML中指定处理程序?使用XAML标记的F#事件处理程序

<Window.Resources> 
    <Style TargetType="Grid"> 
     <Setter Property="funk:Tap.Handler" 
       Value="{Binding TapHandler}"/> 
    </Style> 
</Window.Resources> 

允许:

  • UI元素来处理起泡或隧道RoutedEvents,而不仅仅是控制提高他们
  • 使用隐式风格的,无需接线事件的每一个的UIElement某些类型
  • 基于ViewModel中逻辑的处理程序的更改
  • a没有代码隐藏的视图

回答

2

使用附加属性(基于this post

type Tap() = 
    inherit DependencyObject() 

    // For easy exchange 
    static let routedEvent = MyButtonSimple.TapEvent 

    static let HandlerProperty = 
     DependencyProperty.RegisterAttached 
      ("Handler", typeof<RoutedEventHandler>, 
       typeof<Tap>, new PropertyMetadata(null)) 

    static let OnEvent (sender : obj) args = 
     let control = sender :?> UIElement 
     let handler = control.GetValue(HandlerProperty) :?> RoutedEventHandler 
     if not <| ((handler, null) ||> LanguagePrimitives.PhysicalEquality) then 
      handler.Invoke(sender, args) 

    static do EventManager.RegisterClassHandler(
       typeof<FrameworkElement>, routedEvent, 
        RoutedEventHandler(OnEvent)) 

    static member GetHandler (element: UIElement) : RoutedEventHandler = 
     element.GetValue(HandlerProperty) :?> _ 

    static member SetHandler (element: UIElement, value : RoutedEventHandler) = 
     element.SetValue(HandlerProperty, value) 

wpfApp演示文件,可以发现here(FsXaml 2.1.0)