F # WPF MouseMove params - PullRequest
       7

F # WPF MouseMove params

2 голосов
/ 24 января 2012
canvas.MouseMove.Add(move canvas update)

MouseMove.Add( p1 p2 p3)

Обычно я вижу это использование и документацию, два параметра - (отправитель объекта, MouseEventArgs e) - который я считаю движением и холстом в этом примере кода, взятом из F # .NET Journal's Вычислительная геометрия: быстрый корпус.

Является ли обновление каким-то делагатом? или маршрутизация информации о пузыре в MouseMove.Add?

Я просто не понимаю. Любая помощь приветствуется. Благодарю. Art

Ответы [ 2 ]

5 голосов
/ 24 января 2012

Ответ от kvb дает всю теорию, поэтому я подумал, что мог бы также добавить пример кода.Я не знаю источника фрагмента, поэтому я сделаю некоторые предположения на основе названий - надеюсь, он будет полезен, даже если он может не совпадать с исходным образцом.

Как говорит kvbкод move canvas update на самом деле является вызовом функции, который возвращает функцию, которая затем добавляется в качестве обработчика к событию MouseMove.

Это означает, что move может бытьобъявляется следующим образом:

let move (canvas:Canvas) (update:unit -> unit) (me:MouseEventArgs) =
  // This function gets called when the mouse moves
  // - values me.X and me.Y give the current mouse location
  // - we can access 'canvas' that was declared when registering handler
  // - we can call 'update' to do some more work...
  // Pseudo-example:
  canvas.Children.[0].Width <- me.X
  update()

При регистрации обработчика событий код move canvas update указывает первые два аргумента функции move, так что обработчик может получить доступ к значению canvas, которое, возможно, было объявлено.в месте, где зарегистрирован обработчик (без использования изменяемых переменных!)

let canvas = new Canvas() // Create canvas
let update () = ... // some function that performs update

// Register handler and give it canvas and update as first two arguments
canvas.MouseMove.Add(move canvas update) 

Это также должно объяснить, почему обработчику события не нужно принимать sender:object в качестве первого аргумента - вы можете передатьcanvas (который является отправителем) в качестве первого аргумента с использованием приложения с частичными функциями статически типизированным способом (поэтому вам не нужно приводить object к Canvas).

4 голосов
/ 24 января 2012

Если у вас нет опечатки, move canvas update - это применение функции move к значениям canvas и update, ни одно из которых вы не показываете;это не набор из 3 отдельных передаваемых аргументов.

В общем случае в F # события работают немного иначе, чем в других языках .NET.Когда вы используете метод Add, вы передаете функцию, которая принимает один подкласс EventArgs, а не аргументы отправителя и события.Если вы хотите получить доступ к отправителю из обработчика, используйте вместо него AddHandler;обычно в этом нет необходимости, поскольку отправитель - это просто объект, для которого вы добавляете обработчик, поэтому вам не нужно получать отдельную ссылку на него из обработчика.

...