使用XAML标记的F#事件处理程序 [英] F# Event Handler using XAML markup

查看:89
本文介绍了使用XAML标记的F#事件处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Now that I have a Custom Routed Event, how can I specify a handler in XAML?

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

允许:

  • 用于处理冒泡或隧穿RoutedEvent的UIElement,而不仅仅是处理它们的控件
  • 使用隐式样式,无需为特定类型的每个UIElement关联事件
  • 基于ViewModel中的逻辑更改处理程序
  • 无代码隐藏的视图

推荐答案

使用附加属性(基于此帖子 )

Using an Attached Property (based on 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)

可以在此处(FsXaml 2.1.0)

wpfApp demo files can be found here (FsXaml 2.1.0)

这篇关于使用XAML标记的F#事件处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆