using System; using System.ComponentModel; using System.Globalization; using System.Windows; using System.Windows.Data; using System.Windows.Media; using LiveCharts; using LiveCharts.Defaults; using LiveCharts.Wpf; namespace Wpf.CartesianChart.ZoomingAndPanning { /// /// Interaction logic for ZoomingAndPanning.xaml /// public partial class ZoomingAndPanning : INotifyPropertyChanged { private ZoomingOptions _zoomingMode; public ZoomingAndPanning() { InitializeComponent(); var gradientBrush = new LinearGradientBrush {StartPoint = new Point(0, 0), EndPoint = new Point(0, 1)}; gradientBrush.GradientStops.Add(new GradientStop(Color.FromRgb(33, 148, 241), 0)); gradientBrush.GradientStops.Add(new GradientStop(Colors.Transparent, 1)); SeriesCollection = new SeriesCollection { new LineSeries { Values = GetData(), Fill = gradientBrush, StrokeThickness = 1, PointGeometrySize = 0 } }; ZoomingMode = ZoomingOptions.X; XFormatter = val => new DateTime((long) val).ToString("dd MMM"); YFormatter = val => val.ToString("C"); DataContext = this; } public SeriesCollection SeriesCollection { get; set; } public Func XFormatter { get; set; } public Func YFormatter { get; set; } public ZoomingOptions ZoomingMode { get { return _zoomingMode; } set { _zoomingMode = value; OnPropertyChanged(); } } private void ToogleZoomingMode(object sender, RoutedEventArgs e) { switch (ZoomingMode) { case ZoomingOptions.None: ZoomingMode = ZoomingOptions.X; break; case ZoomingOptions.X: ZoomingMode = ZoomingOptions.Y; break; case ZoomingOptions.Y: ZoomingMode = ZoomingOptions.Xy; break; case ZoomingOptions.Xy: ZoomingMode = ZoomingOptions.None; break; default: throw new ArgumentOutOfRangeException(); } } private ChartValues GetData() { var r = new Random(); var trend = 100; var values = new ChartValues(); for (var i = 0; i < 100; i++) { var seed = r.NextDouble(); if (seed > .8) trend += seed > .9 ? 50 : -50; values.Add(new DateTimePoint(DateTime.Now.AddDays(i), trend + r.Next(0, 10))); } return values; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { if (PropertyChanged != null) PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private void ResetZoomOnClick(object sender, RoutedEventArgs e) { //Use the axis MinValue/MaxValue properties to specify the values to display. //use double.Nan to clear it. X.MinValue = double.NaN; X.MaxValue = double.NaN; Y.MinValue = double.NaN; Y.MaxValue = double.NaN; } } public class ZoomingModeCoverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { switch ((ZoomingOptions) value) { case ZoomingOptions.None: return "None"; case ZoomingOptions.X: return "X"; case ZoomingOptions.Y: return "Y"; case ZoomingOptions.Xy: return "XY"; default: throw new ArgumentOutOfRangeException(); } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }