Играя с шипом, я пытаюсь перетащить ярлык WPF. Я перевел mkMouseTracker
код Дона Сайма из здесь , и похоже, что он должен работать, но по какой-то причине нет никакой разницы между двумя аргументами, возвращенными из mouseEvent
, поэтому моя метка никогда не перемещается .
printf
ing, похоже, показывает, что параметр last
проглатывается / заменяется значениями из moveArgs. Это как-то связано с использованием ref
?
Извините, кодовый блок немного длинный, но он самодостаточен.
#r "WindowsBase"
#r "PresentationCore"
#r "PresentationFramework"
#r "System.Xaml"
open System
open System.Windows
open System.Windows.Media
open System.Windows.Controls
let window = new Window(Name="Test",Width=500.0,Height=500.0)
window.Visibility <- Visibility.Visible
window.Show()
let l = new System.Windows.Controls.Label(Height = 30., Width = 150.,
BorderBrush = Brushes.Black, BorderThickness = Thickness(3.))
window.Content <- l
let mkMouseTracker (c : #UIElement) =
let event = new Event<_>()
let lastArgs = ref None
c.MouseDown.Add(fun args -> lastArgs := Some (args :> Input.MouseEventArgs ))
c.MouseUp .Add(fun args -> lastArgs := None)
c.MouseMove.Add(fun moveArgs ->
match !lastArgs with
| Some last -> event.Trigger(last,moveArgs); lastArgs := Some moveArgs
| None -> ())
event.Publish
let mouseEvent = mkMouseTracker l
mouseEvent.Add(fun (args1, args2) ->
let pos1, pos2 = args1.GetPosition(l), args2.GetPosition(l)
l.RenderTransform <- TranslateTransform(pos2.X - pos1.X, pos2.Y - pos1.Y)
l.Content <- sprintf "%A: %A -> %A" args1.Timestamp pos1 pos2)