2010-12-10 57 views
1

savez-vous pourquoi l'événement DragDrop dans F # ne fonctionne pas correctement dans mon exemple? Tous les autres événements comme DragEnter, DragLeave, DragOver, ... fonctionnent bien de la même manière. Il suffit de compiler ce code et de l'essayer, de faire glisser un fichier dans le formulaire et de voir les événements déclenchés dans la console/le terminal à partir de l'endroit où vous avez démarré l'exécutable.F # Glisser-déposer à l'aide de WinForms: l'événement DragDrop d'un contrôle n'appelle pas la fonction membre référencée

open System 
open System.Drawing 
open System.Windows.Forms 

type MainForm(args: string list) as this = 
    // subclassing 
    inherit Form() 

    // controls ------------------- 
    let dragDropImage = new PictureBox() 
    // ---------------------------- 

    // "constructor" (not a real constructor) 
    do this.initComponents() 
    // link events to specific member function 
    do dragDropImage.DragEnter |> Event.add this.onDragEnter 
    do dragDropImage.DragDrop |> Event.add this.onDragDrop 
    // this syntax don't work either: do dragDropImage.DragDrop.Add(fun _ -> printfn "dragDrop") 
    do dragDropImage.DragLeave |> Event.add this.onDragLeave 
    do dragDropImage.DragOver |> Event.add this.onDragOver 

    member this.initComponents() = 
     // main form attributes 
     this.Text <- "Averest-GUI" 
     this.ClientSize <- new Size(350,230) 
     this.StartPosition <- FormStartPosition.CenterScreen 
     // drag'n'drop field 
     dragDropImage.Size <- new Size(330,210) 
     dragDropImage.Location <- new Point(7,7) 
     dragDropImage.AllowDrop <- true // allow Drag'n'Drop functionality 
     // insert controls into MainForm 
     this.Controls.Add(dragDropImage) 

    member this.onDragLeave(e: EventArgs) = 
     printfn "DragLeave" //e.Effect <- DragDropEffects.Copy 

    member this.onDragOver(e: DragEventArgs) = 
     printfn "DragOver" //e.Effect <- DragDropEffects.Copy 

    member this.onDragEnter(e: DragEventArgs) = 
     printfn "DragEnter" //e.Effect <- DragDropEffects.Copy 

    member this.onDragDrop(e: DragEventArgs) = 
     printfn "DragDrop" 


let testForm = 
    let temp = new MainForm(["Test"]) 
    temp 

// single thread apartment model (interacting with COM components) 
[<STAThread>] 
do Application.Run(testForm) 

Répondre

3

Supprimer le commentaire de onDragEnter. La suppression ne sera pas autorisée, sauf si vous définissez e.Effect sur l'un des e.AllowedEffects. Cela change aussi le curseur.

+0

merci beaucoup, cela a fonctionné parfaitement! –