FSI WPF Event Loop

后端 未结 1 1443
無奈伤痛
無奈伤痛 2021-01-16 05:19

Is the WPF event loop in this answer still a good one for FSI (besides rethrow which is now reraise)? The answer is from 2008 and I\'m not sure if

1条回答
  •  粉色の甜心
    2021-01-16 05:52

    Yes the default is for Winforms, I do use the WpfEventLoop quite a lot, Code is below,

    #I "c:/Program Files/Reference Assemblies/Microsoft/Framework/v3.0"
    #I "C:/WINDOWS/Microsoft.NET/Framework/v3.0/WPF/"
    #r "PresentationCore.dll"
    #r "PresentationFramework.dll"
    #r "WindowsBase.dll"
    
    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()
    

    Test code

    open System
    open System.Windows
    open System.Windows.Controls
    
    let window = new Window(Title = "Simple Test", Width = 800., Height = 600.)
    window.Show()
    
    let textBox = new TextBox(Text = "F# is fun")
    window.Content <- textBox
    

    Let me know if this helps.

    -Fahad

    0 讨论(0)
提交回复
热议问题