FSI WPF Event Loop - PullRequest
       13

FSI WPF Event Loop

1 голос
/ 20 апреля 2011

Является ли цикл событий WPF в этот ответом по-прежнему хорошим для FSI (кроме rethrow, который сейчас reraise)? Ответ с 2008 года, и я не уверен, есть ли какие-либо "лучшие" реализации вокруг. Если нет, то кем бы ты был?

Мое понимание заключается в том, что реализация по умолчанию для WinForms.

1 Ответ

2 голосов
/ 11 мая 2011

Да, по умолчанию для Winforms, я довольно часто использую WpfEventLoop, код ниже,

#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()

Тестовый код

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

Дайте мне знать, если это поможет.

-Fahad

...