您的位置:首页 > 运维架构

fsi event loop

2015-08-10 15:29 369 查看
在默认情况下fsi 中的Event loop是绑定到winform中的,如果我们在fsi中测试WPF的控件时,加载自定义的WPF控件,有些消息就无法正常响应。比如按键消息就无法正常响应。这时需要重定义fsi的Event loop。好在有现成的示例。

module WPFEventLoop =

open System

open System.Windows

open System.Windows.Threading

open Microsoft.FSharp.Compiler.Interactive

open Microsoft.FSharp.Compiler.Interactive.Settings

type RunDelegate<'b> = delegate of unit -> 'b

let Create() =

let app =

try

// Ensure the current application exists. This may fail, if it already does.

let app = new Application() in

// Create a dummy window to act as the main window for the application.

// Because we're in FSI we never want to clean this up.

new Window() |> ignore;

app

with :? InvalidOperationException -> Application.Current

let disp = app.Dispatcher

let restart = ref false

{ new IEventLoop with

member x.Run() =

app.Run() |> ignore

!restart

member x.Invoke(f) =

try

disp.Invoke(DispatcherPriority.Send,new RunDelegate<_>(fun () -> box(f ()))) |> unbox

with e -> eprintf "\n\n ERROR: %O\n" e; reraise()

member x.ScheduleRestart() = ()

//restart := true;

//app.Shutdown()

}

let Install() = fsi.EventLoop <- Create()

WPFEventLoop.Install()

运行之后按键消息就可以正常响应了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: