2016-09-06 8 views
2

Теперь, когда у меня есть Custom Routed Event, как я могу указать обработчик в XAML?F # Обработчик событий с использованием разметки XAML

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

Разрешение:

  • UiElements для обработки Bubbling или туннельные RoutedEvents, а не только контроль повышения их
  • Использование неявных стилей, устраняя необходимость телеграфировать событие для каждого UIElement из определенный тип
  • Изменение обработчика на основе логики в ViewModel
  • представления с не фоновым кодом

ответ

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)