2012-10-18 3 views
0

Я новичок в Caliburn Micro и пытаюсь захватить позицию мыши, когда левая кнопка находится на элементе управления Viewport3D.Caliburn Micro Capture Mouse Position

Использование этого в XAML;

cal:Message.Attach="[Event MouseLeftButtonUp] = [Action MouseUp($eventArgs, $source)] 

и что в ViewModel:

public void MouseUp(MouseEventArgs args, IInputElement elem) 
{ 
    Point pt = args.GetPosition(elem); 
    //do something with pt 
} 

я могу получить мыши ударить позицию. Тем не менее, я хотел бы иметь в ViewModel что-то вроде:

public void MouseUp(Point pt) 
{ 
    // do something with pt 
} 

Я не хочу иметь параметры IInputElement и т.д. в моем ViewModel - событие, поднятый Viewport поэтому его следует рассматривать как IInputElement ,

Могу ли я достичь этого?

Заранее спасибо.

ответ

3

Да, вы можете это сделать. То, что вы хотите сделать, - использовать MessageBinder.SpecialValues, чтобы создать собственное специальное значение, которое будет анализировать точку и возвращать ее.

Итак, где вы настраиваете Caliburn.Micro, добавьте следующий код:

 MessageBinder.SpecialValues.Add("$mousepoint", ctx => 
     { 
      var e = ctx.EventArgs as MouseEventArgs; 
      if (e == null) 
       return null; 

      return e.GetPosition(ctx.Source); 
     }); 

Затем вы можете использовать его в Message.Attach так:

cal:Message.Attach="[Event MouseLeftButtonUp] = [Action MouseUp($mousepoint)] 

Там вы идете, уборщик ViewModel :).

+0

Не забудьте убедиться, что имя параметра вашего специального значения указано в нижнем регистре или вы можете столкнуться с проблемами передачи параметров! – Charleh