// ** utilities
        void CreateDataSeries(C1Chart chart, WeatherData[] data)
        {
            chart.Data.Children.Clear();

            #if DataBinding
              chart.Data.ItemsSource = data;
            #else
              int len = data.Length;
              DateTime[] days = new DateTime[len];
              double[] tmin = new double[len];
              double[] tmax = new double[len];
              double[] tavg = new double[len];
              for (int i = 0; i < len; i++)
              {
            days[i] = data[i].DateTime;
            tmin[i] = data[i].TMin;
            tmax[i] = data[i].TMax;
            tavg[i] = data[i].TAvg;
              }
            #endif

              XYDataSeries ds = new XYDataSeries(); ds.Label = "Minimum";
            #if DataBinding
              ds.ValueBinding = new Binding("TMin");
              ds.XValueBinding = new Binding("DateTime");
            #else
              ds.XValuesSource = days;
              ds.ValuesSource = tmin;
            #endif
              ds.ConnectionStroke = new SolidColorBrush(Colors.Blue);
              chart.Data.Children.Add(ds);

              ds = new XYDataSeries(); ds.Label = "Maximum";
            #if DataBinding
              ds.ValueBinding = new Binding("TMax");
              ds.XValueBinding = new Binding("DateTime");
            #else
              ds.XValuesSource = days;
              ds.ValuesSource = tmax;
            #endif
              ds.ConnectionStroke = new SolidColorBrush(Colors.Red);
              chart.Data.Children.Add(ds);

              ds = new XYDataSeries(); ds.Label = "Average";
            #if DataBinding
              ds.ValueBinding = new Binding("TAvg");
              ds.XValueBinding = new Binding("DateTime");
            #else
              ds.XValuesSource = days;
              ds.ValuesSource = tavg;
            #endif
              chart.Data.Children.Add(ds);

              foreach (DataSeries ser in chart.Data.Children)
            ser.ConnectionStrokeThickness = 1;

              chart.View.AxisX.IsTime = true;
              chart.View.AxisX.AnnoPosition = AnnoPosition.Near;
        }
        // ** ctor
        public ZoomChartControl()
        {
            InitializeComponent();

              Loaded += new RoutedEventHandler(ZoomChart_Loaded);

              // read data
              CSVData data = new CSVData();
              using (Stream stream = Assembly.GetExecutingAssembly().
              GetManifestResourceStream("ChartSamples.Resources.weatherYear.csv"))
              {
            data.Read(stream, true, false);
              }

              int len = data.Length;
              WeatherData[] wdata = new WeatherData[len];

              double min = double.MaxValue;
              double max = double.MinValue;

              // fill array
              for (int i = 0; i < len; i++)
              {
            wdata[i] = new WeatherData(DateTime.Parse(data[i, 0]),
            double.Parse(data[i, "Max TemperatureF"]),
            double.Parse(data[i, "Mean TemperatureF"]),
            double.Parse(data[i, "Min TemperatureF"]));

            min = Math.Min(min, wdata[i].TMin);
            max = Math.Max(max, wdata[i].TMax);
              }

              _min = wdata[0].DateTime.ToOADate();
              _max = wdata[len - 1].DateTime.ToOADate();

              if (len > 0)
              {
            chart.BeginUpdate();
            CreateDataSeries(chart, wdata);

            chart.ChartType = ChartType.Line;
            chart.View.AxisX.AnnoFormat = "MMM";
            chart.View.AxisX.MinorTickHeight = 0;
            chart.View.AxisX.Min = _min;
            chart.View.AxisX.Max = _max;

            chart.EndUpdate();

            chartZoom.BeginUpdate();
            CreateDataSeries(chartZoom, wdata);
            chartZoom.ChartType = ChartType.Line;
            chartZoom.View.AxisX.AnnoFormat = "dd-MMM";
            chartZoom.View.AxisX.Max = _min + 0.25 * (_max - _min);
            chartZoom.View.AxisX.MinorTickHeight = 0;
            chartZoom.EndUpdate();
              }
        }
        private void SetTemperatureChart()
        {
            // read data
            CSVData data = new CSVData();

            using (Stream stream = Assembly.GetExecutingAssembly().
                                   GetManifestResourceStream("ChartSamples.Resources.weatherYear.csv"))
            {
                data.Read(stream, true, true);
            }

            int len = data.Length;

            WeatherData[] wdata = new WeatherData[len];

            double min = double.MaxValue;
            double max = double.MinValue;

            // fill the array
            for (int i = 0; i < len; i++)
            {
                wdata[i] = new WeatherData(DateTime.Parse(data[i, 0]),
                                           double.Parse(data[i, "Max TemperatureF"]),
                                           double.Parse(data[i, "Mean TemperatureF"]),
                                           double.Parse(data[i, "Min TemperatureF"]));

                min = Math.Min(min, wdata[i].TMin);
                max = Math.Max(max, wdata[i].TMax);
            }

            if (len > 0)
            {
                chart.BeginUpdate();
                chart.Data.Children.Clear();
                chart.Data.ItemsSource = wdata;


                // create data series
                HighLowSeries ds = new HighLowSeries();
                ds.ChartType        = ChartType.Gantt;
                ds.Label            = "Temp";
                ds.LowValueBinding  = new Binding("TMin");
                ds.XValueBinding    = new Binding("DateTime");
                ds.HighValueBinding = new Binding("TMax");
                ds.Style            = this.Resources["highlowseries"] as Style;

                chart.Data.Children.Add(ds);

                XYDataSeries ds2 = new XYDataSeries();
                ds2.ChartType     = ChartType.Line;
                ds2.Label         = "Average";
                ds2.ValueBinding  = new Binding("TAvg");
                ds2.XValueBinding = new Binding("DateTime");
                chart.Data.Children.Add(ds2);

                // set axis min and max
                chart.View.AxisX.Min = wdata[0].DateTime.Subtract(new TimeSpan(1, 0, 0, 0)).ToOADate();
                chart.View.AxisX.Max = wdata[len - 1].DateTime.ToOADate();

                chart.View.AxisY.Min = min;
                chart.View.AxisY.Max = max;

                // style chart
                chart.View.AxisX.IsTime             = true;
                chart.View.AxisY.MajorTickThickness = 0;
                chart.View.AxisY.MinorTickThickness = 0;
                chart.View.AxisY.AxisLine           = new Line()
                {
                    StrokeThickness = 0
                };
                chart.View.AxisX.Scale     = 0.4;
                chart.View.AxisX.ScrollBar = new AxisScrollBar();
                chart.View.AxisX.MajorGridStrokeThickness = 0;
                chart.View.AxisX.MinorGridStrokeThickness = 0;
                chart.View.AxisX.MajorTickThickness       = 0;
                chart.View.AxisX.MinorTickThickness       = 0;
                chart.View.AxisX.AxisLine = new Line()
                {
                    StrokeThickness = 0
                };
                chart.View.AxisY.Title = new TextBlock()
                {
                    Text = "Temperature", HorizontalAlignment = System.Windows.HorizontalAlignment.Center
                };

                chart.EndUpdate();
            }
        }
        private void SetTemperatureChart()
        {
            // read data
            CSVData data = new CSVData();
            using (Stream stream = Assembly.GetExecutingAssembly().
                GetManifestResourceStream("ChartSamples.Resources.weatherYear.csv"))
            {
                data.Read(stream, true, true);
            }

            int len = data.Length;
            WeatherData[] wdata = new WeatherData[len];

            double min = double.MaxValue;
            double max = double.MinValue;

            // fill the array
            for (int i = 0; i < len; i++)
            {
                wdata[i] = new WeatherData(DateTime.Parse(data[i, 0]),
                      double.Parse(data[i, "Max TemperatureF"]),
                      double.Parse(data[i, "Mean TemperatureF"]),
                      double.Parse(data[i, "Min TemperatureF"]));

                min = Math.Min(min, wdata[i].TMin);
                max = Math.Max(max, wdata[i].TMax);
            }

            if (len > 0)
            {
                chart.BeginUpdate();
                chart.Data.Children.Clear();
                chart.Data.ItemsSource = wdata;

                // create data series
                HighLowSeries ds = new HighLowSeries();
                ds.ChartType = ChartType.Gantt;
                ds.Label = "Temp";
                ds.LowValueBinding = new Binding("TMin");
                ds.XValueBinding = new Binding("DateTime");
                ds.HighValueBinding = new Binding("TMax");
                ds.Style = this.Resources["highlowseries"] as Style;

                chart.Data.Children.Add(ds);

                XYDataSeries ds2 = new XYDataSeries();
                ds2.ChartType = ChartType.Line;
                ds2.Label = "Average";
                ds2.ValueBinding = new Binding("TAvg");
                ds2.XValueBinding = new Binding("DateTime");
                chart.Data.Children.Add(ds2);

                // set axis min and max
                chart.View.AxisX.Min = wdata[0].DateTime.Subtract(new TimeSpan(1, 0, 0, 0)).ToOADate();
                chart.View.AxisX.Max = wdata[len - 1].DateTime.ToOADate();

                chart.View.AxisY.Min = min;
                chart.View.AxisY.Max = max;

                // style chart
                chart.View.AxisX.IsTime = true;
                chart.View.AxisY.MajorTickThickness = 0;
                chart.View.AxisY.MinorTickThickness = 0;
                chart.View.AxisY.AxisLine = new Line() { StrokeThickness = 0 };
                chart.View.AxisX.Scale = 0.4;
                chart.View.AxisX.ScrollBar = new AxisScrollBar();
                chart.View.AxisX.MajorGridStrokeThickness = 0;
                chart.View.AxisX.MinorGridStrokeThickness = 0;
                chart.View.AxisX.MajorTickThickness = 0;
                chart.View.AxisX.MinorTickThickness = 0;
                chart.View.AxisX.AxisLine = new Line() { StrokeThickness = 0 };
                chart.View.AxisY.Title = new TextBlock() { Text = "Temperature", HorizontalAlignment = System.Windows.HorizontalAlignment.Center };

                chart.EndUpdate();
            }
        }
        public MultipleAxes()
        {
            InitializeComponent();

              // read data
              CSVData data = new CSVData();
              using (Stream stream = Assembly.GetExecutingAssembly().
              GetManifestResourceStream("ChartSamples.Resources.weatherYear.csv"))
              {
              data.Read(stream, true, true);
              }

              int len = data.Length;
              WeatherData[] wdata = new WeatherData[len];

              double min = double.MaxValue;
              double max = double.MinValue;

              // fill the array
              for (int i = 0; i < len; i++)
              {
            wdata[i] = new WeatherData(DateTime.Parse(data[i, 0]),
              double.Parse(data[i, "Max TemperatureF"]),
              double.Parse(data[i, "Mean TemperatureF"]),
              double.Parse(data[i, "Min TemperatureF"]));

              min = Math.Min(min, wdata[i].TMin);
              max = Math.Max(max, wdata[i].TMax);
              }

              if (len > 0)
              {
              chart.BeginUpdate();
              chart.Data.Children.Clear();
              chart.Data.ItemsSource = wdata;

              Style ss = (Style)Resources["sstyle"];

            // create data series
              XYDataSeries ds = new XYDataSeries(); ds.Label = "Minimum";
              ds.ValueBinding = new Binding("TMin");
              ds.XValueBinding = new Binding("DateTime");
              ds.SymbolStyle = ss;
              chart.Data.Children.Add(ds);

              ds = new XYDataSeries(); ds.Label = "Maximum";
              ds.ValueBinding = new Binding("TMax");
              ds.XValueBinding = new Binding("DateTime");
              ds.SymbolStyle = ss;
              chart.Data.Children.Add(ds);

            //ds = new XYDataSeries(); ds.Label = "Average";
            //ds.ValueBinding = new Binding("TAvg");
            //ds.XValueBinding = new Binding("DateTime");
            //ds.SymbolStyle = ss;
              //chart.Data.Children.Add(ds);

              chart.View.AxisX.Min = wdata[0].DateTime.ToOADate();
            chart.View.AxisX.Max = wdata[len - 1].DateTime.ToOADate();

              chart.View.AxisY.Min = min;
              chart.View.AxisY.Max = max;

              chart.EndUpdate();
              }

              WaitAndDisableAnimation();
        }