728x90
1. Command 정의 및 Binding
Oxyplot의 PlotController 에 원하는 이벤트에 대한 Command를 Binding 한다.
이를 위해서 어떤 데이터를 변수로 handle 할지를 정의한 Delegate를 선언한다.
그리고 원하는 이벤트에 Binding 을 한다.
private PlotController BuildMainPlotcontroller()
{
var plotController = new PlotController();
// plotController.UnbindAll();
// Custom Command 함수를 위한 Delegate를 정의한다.
HeatmapClicked =
new DelegatePlotCommand<OxyMouseDownEventArgs>((view, controller, args) =>
HeatmapClickedCommand(view, args));
// Custom command의 delegate를 이벤트에 bind 한다
plotController.BindMouseDown(OxyMouseButton.Left, OxyModifierKeys.Control, HeatmapClicked);
plotController.BindMouseDown(OxyMouseButton.Left, OxyModifierKeys.None, PlotCommands.SnapTrack);
return plotController;
}
Delegate에서 처리할 Eventhandler 함수를 선언한다.
Delegate에서 지정한 Argument type를 매개변수로 받는 함수이다.
private void HeatmapClickedCommand(IPlotView view, OxyMouseDownEventArgs args)
{
var viewXAxis = view.ActualModel.Axes.First(ax => ax.Tag == "X");
var posX = viewXAxis.InverseTransform(args.Position.X);
var viewYAxis = view.ActualModel.Axes.First(ax => ax.Tag == "Y");
var posY = viewYAxis.InverseTransform(args.Position.Y);
// 현재의 TimeFrame에서 Pick 한 위치의 실제 Instant time을 계산한다
var pickPosX = Duration.FromMilliseconds((long)(posX * 10));
var posTime = CurrentTimeFrameVM.Data.TimeRange().Start.Plus(pickPosX);
// 현재의 Sensor Range를 기준으로 센서 몇번에서 클릭되었는지를 계산한다
var tmpPos = (int)(posY / CurrentTimeFrameVM.Data.ExamData.InterpolationScale + 0.5);
var posSensor = CurrentTimeFrameVM.Data.SensorRange().Lesser + tmpPos;
logger.LogTrace($"Clicked pos {posX:F2}, {posY:F2}");
logger.LogTrace($"Frame pos {CurrentTimeFrameVM.Data.TimeRange().Start:F2}, {CurrentTimeFrameVM.Data.SensorRange().Lesser:F2}");
logger.LogTrace($"Pick Sample : {posTime.ToUnixTimeMilliseconds()}, {tmpPos}");
}
728x90
728x90