我正在尝试使用F#和异步工作流在Silverlight中实现拖放.
我只是试图在画布上拖动一个矩形,使用两个循环来处理两个状态(等待和拖动),这是我从Tomas Petricek的书"Real-world Functional Programming"中得到的一个想法,但我遇到了一个问题:
与WPF或WinForms不同,Silverlight的MouseEventArgs不包含有关按钮状态的信息,因此我无法通过检查是否不再按下鼠标左键来从拖动循环返回.我只是通过引入一个可变标志来解决这个问题.
有没有人有这个解决方案,这不涉及可变状态?
这是相关的代码部分(请原谅拖拽拖动代码,将矩形捕捉到鼠标指针):
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 …Run Code Online (Sandbox Code Playgroud)