public Indicator(View Chart, bool Twin = false) : base(Chart) { this.Twin = Twin; Grid.SetColumn(ScaleGrd, 2); pixelsPerDip = VisualTreeHelper.GetDpi(ScaleVisual).PixelsPerDip; IndicatorCanvasBase.AddVisual(IndicatorVisualBase); GridCanvas.AddVisual(GridVisual); ScaleCanvas.AddVisual(ScaleVisual); BaseGrd.MouseEnter += (s, e) => Chart.Interaction = ShoWMenu; BaseGrd.MouseLeave += (s, e) => { if (Chart.Interaction == ShoWMenu) { Chart.Interaction = null; } }; BaseGrd.MouseEnter += CursorShow; BaseGrd.MouseLeave += CursorLeave; BaseGrd.MouseMove += CursorRedraw; BaseGrd.MouseEnter += (s, e) => Chart.SetMoving(s, e); BaseGrd.MouseLeave += (s, e) => Chart.BreakMoving(s, e); BaseGrd.SizeChanged += BaseGrd_SizeChanged; BaseGrd.Children.Add(Selector); BaseGrd.Children.Add(GridCanvas); BaseGrd.ClipToBounds = true; BaseGrd.Background = CursorGrabber; BaseGrd.Cursor = Cursors.None; { var L2grd = new Grid(); { var L3grd = new Grid { RenderTransformOrigin = new Point(1, 0.5), RenderTransform = ScX }; { var L4grd = new Grid { RenderTransformOrigin = new Point(0.5, 0.5) }; { var tgr = new TransformGroup(); { tgr.Children.Add(new RotateTransform(180)); tgr.Children.Add(Translate); tgr.Children.Add(ScY); } L4grd.RenderTransform = tgr; L4grd.Children.Add(IndicatorCanvasBase); } L3grd.Children.Add(L4grd); } L2grd.Children.Add(L3grd); } BaseGrd.Children.Add(L2grd); } if (Twin) { IndicatorCanvasSecond = new DrawingCanvas(); IndicatorVisualSecond = new DrawingVisual(); IndicatorCanvasSecond.AddVisual(IndicatorVisualSecond); BaseGrd.Children.Add(IndicatorCanvasSecond); } BaseGrd.Children.Add(CursorLayer); ScaleGrd.ClipToBounds = true; ScaleGrd.Background = CursorGrabber; ScaleGrd.Children.Add(ScaleCanvas); ScaleGrd.Children.Add(ValueMarkLayer); CursorLinesTransform = (TranslateTransform)Chart.CursorLinesLayer.RenderTransform; CursorLayer.RenderTransform = CursorTransform; Chart.CandlesChanged += ac => Redraw(); Chart.AllHorizontalReset += HorizontalReset; Chart.NewXScale += sc => Task.Run(() => Dispatcher.Invoke(() => ScaleX = sc)); Chart.NewXTrans += tr => Task.Run(() => Dispatcher.Invoke(() => Translate.X = tr)); if (Twin) { Chart.AllHorizontalReset += ac => SecondReset(); Chart.NewXScale += sc => SecondReset(); Chart.NewXTrans += sc => SecondReset(); } Chart.NewFSF += fsf => RedrawScale(); }