F # Drag and Drop с использованием WinForms: событие DragDrop элемента управления не вызывает функцию-член, на которую ссылаются - PullRequest
1 голос
/ 10 декабря 2010

Знаете ли вы, почему событие DragDrop в F # не работает должным образом в моем примере?Все остальные события, такие как DragEnter, DragLeave, DragOver, ... работают точно так же.

Просто скомпилируйте этот код и попробуйте его, перетащите файл в форму и увидите события, запущенные в консоли/ терминал, с которого вы запускаете исполняемый файл.

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)

1 Ответ

3 голосов
/ 10 декабря 2010

Удалить комментарий от onDragEnter. Удаление не будет разрешено, если вы не установите e.Effect на один из e.AllowedEffects. Это также меняет курсор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...