Я пытаюсь реализовать перетаскивание в Silverlight, используя F # и асинхронные рабочие процессы.
Я просто пытаюсь перетащить прямоугольник на холсте, используя два цикла для двух состояний (ожиданиеи перетаскивание), идея, которую я получил из книги Томаса Петричека «Функциональное программирование в реальном мире», но столкнулся с проблемой:
В отличие от WPF или WinForms, MouseEventArgs Silverlight не несут информацию о состоянии кнопки,Я не могу вернуться из цикла перетаскивания, проверив, не нажата ли левая кнопка мыши.Мне удалось решить эту проблему только с помощью изменяемого флага.
У кого-нибудь есть решение для этого, которое не включает изменяемое состояние?
Вот соответствующая часть кода (пожалуйста, извините за неаккуратное перетаскиваниекод, который привязывает прямоугольник к указателю мыши):
type MainPage() as this =
inherit UserControl()
do
Application.LoadComponent(this, new System.Uri("/SilverlightApplication1;component/Page.xaml", System.UriKind.Relative))
let layoutRoot : Canvas = downcast this.FindName("LayoutRoot")
let rectangle1 : Rectangle = downcast this.FindName("Rectangle1")
let mutable isDragged = false
do
rectangle1.MouseLeftButtonUp.Add(fun _ -> isDragged <- false)
let rec drag() = async {
let! args = layoutRoot.MouseMove |> Async.AwaitEvent
if (isDragged) then
Canvas.SetLeft(rectangle1, args.GetPosition(layoutRoot).X)
Canvas.SetTop(rectangle1, args.GetPosition(layoutRoot).Y)
return! drag()
else
return()
}
let wait() = async {
while true do
let! args = Async.AwaitEvent rectangle1.MouseLeftButtonDown
isDragged <- true
do! drag()
}
Async.StartImmediate(wait())
()
Большое спасибо за потраченное время!