【问题标题】:F# Event Handler using XAML markup使用 XAML 标记的 F# 事件处理程序
【发布时间】:2016-09-06 13:26:58
【问题描述】:

现在我有一个Custom Routed Event,如何在 XAML 中指定一个处理程序?

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

允许:

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

【问题讨论】:

    标签: wpf xaml f# handler routedevent


    【解决方案1】:

    使用附加属性(基于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) 找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2018-07-13
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多