小编kno*_*tig的帖子

使用F#和异步工作流在Silverlight中拖放

我正在尝试使用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)

silverlight f# asynchronous drag-and-drop

3
推荐指数
1
解决办法
417
查看次数

标签 统计

asynchronous ×1

drag-and-drop ×1

f# ×1

silverlight ×1