2

既然我有一个自定义路由事件,我如何在 XAML 中指定一个处理程序?

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

允许:

  • UIElements 来处理冒泡或隧道 RoutedEvents,而不仅仅是控件引发它们
  • 使用隐式样式,无需为特定类型的每个 UIElement 连接事件
  • 根据 ViewModel 中的逻辑更改处理程序
  • 没有代码隐藏的视图
4

1 回答 1

2

使用附加属性(基于这篇文章

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 演示文件可以在这里找到(FsXaml 2.1.0)

于 2016-09-06T13:26:58.583 回答