using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; namespace RealTimeGraphEx.Components { public class YAxisWave : YAxisScroll { private Grid innerGrid; public YAxisWave() : base() { } public override void Render(RealTimeGraphExBase graph, bool animate = false) { if (graph == null) return; if (innerGrid == null) { innerGrid = new Grid(); } if (Interval == 0) return; if (Interval % 2 != 0) Interval += 1; var grid = innerGrid; var renderBounds = Graph.GetGraphRenderBounds(); double animationTime = animate ? 0.2 : 0; DoubleAnimation heightAnimation = new DoubleAnimation() { Duration = new Duration(TimeSpan.FromSeconds(animationTime)) }; heightAnimation.To = double.IsNaN(Graph.gridLinesAndImageWrapperGrid.Height) ? Graph.gridLinesAndImageWrapperGrid.ActualHeight : Graph.gridLinesAndImageWrapperGrid.Height; if (!double.IsNaN(grid.Height)) { grid.BeginAnimation(Grid.HeightProperty, heightAnimation); } else { grid.Height = Graph.gridLinesAndImageWrapperGrid.ActualHeight; } grid.VerticalAlignment = System.Windows.VerticalAlignment.Top; ThicknessAnimation marginAni = new ThicknessAnimation() { Duration = new Duration(TimeSpan.FromSeconds(animationTime)) }; marginAni.To = new Thickness(0, Graph.gridLinesAndImageWrapperGrid.Margin.Top, 0, 0); if (!double.IsNaN(grid.Height)) { grid.BeginAnimation(MarginProperty, marginAni); } else { grid.Margin = new Thickness(0, Graph.gridLinesAndImageWrapperGrid.Margin.Top, 0, 0); } this.ClipToBounds = true; this.Content = grid; double height = double.IsNaN(Graph.gridLinesAndImageWrapperGrid.Height) ? Graph.gridLinesAndImageWrapperGrid.ActualHeight : Graph.gridLinesAndImageWrapperGrid.Height; int interval = (int)Math.Round((Interval * (((height * 100) / Graph.gridMain.ActualHeight) / 100)), MidpointRounding.ToEven); grid.RowDefinitions.Clear(); grid.Children.Clear(); for (int i = 0; i < interval; i++) { RowDefinition rowLabels = new RowDefinition(); rowLabels.Height = new GridLength(1, GridUnitType.Star); grid.RowDefinitions.Add(rowLabels); } for (int i = 0; i < interval; i++) { AddLabel(Math.Abs((graph.Maximum - (i * ((graph.Maximum + Math.Abs(graph.Minimum)) / (interval / 2))))).ToString(StringFormat), graph, grid, i, System.Windows.VerticalAlignment.Top); } AddLabel(graph.Maximum.ToString(StringFormat), graph, grid, interval - 1, System.Windows.VerticalAlignment.Bottom); } protected override void OnGraphZoomComplete(Point transformOrigin, double scaleX, double scaleY) { Render(Graph, true); } protected override void OnGraphPanningComplete(Point translate) { if (innerGrid != null) { var renderBounds = Graph.GetGraphRenderBounds(); innerGrid.BeginAnimation(MarginProperty, null); innerGrid.Margin = new Thickness(0, renderBounds.Top, 0, 0); } } } }