Обработчик событий F# с использованием разметки XAML
Теперь, когда у меня есть событие Custom Routed, как я могу указать обработчик в XAML?
<Window.Resources>
<Style TargetType="Grid">
<Setter Property="funk:Tap.Handler"
Value="{Binding TapHandler}"/>
</Style>
</Window.Resources>
Разрешение:
- UIElements для обработки пузырей или туннелирования RoutedEvents, а не только управляющие элементы, вызывающие их
- Использование неявных стилей, исключающее необходимость связывать событие для каждого элемента UIE определенного типа.
- Смена обработчика на основе логики во ViewModel
- Вид без кода
1 ответ
Решение
Использование прикрепленного свойства (на основе этого поста)
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)