zoukankan      html  css  js  c++  java
  • WPFTookit Chart 高级进阶

    数据源增加SeriesSource

    使用方式

    <Charting:Chart x:Name="chart"
    Helper:ChartHelper.DependentValueBinding="Value"
    Helper:ChartHelper.IndependentValueBinding="Key"
    Helper:ChartHelper.Title="TitlePropertyOnCollection"
    Helper:ChartHelper.SeriesType="Line"
    Helper:ChartHelper.SeriesSource="{Binding Path=MyCollectionofCollections}" />
     

    增加依赖属性

    public enum SeriesType
    {
        Line,
        Bar,
        Column,
        Scatter,
        Pie
    }
    
    public class ChartHelper
    {
        #region SeriesSource
    
        public static readonly DependencyProperty SeriesSourceProperty =
                DependencyProperty.RegisterAttached("SeriesSource", 
                                                    typeof(IEnumerable), 
                                                    typeof(ChartHelper),
                                                    new PropertyMetadata(SeriesSourceChanged));
    
        public static IEnumerable GetSeriesSource(DependencyObject d)
        {
            return (IEnumerable)d.GetValue(SeriesSourceProperty);
        }
    
        public static void SetSeriesSource(DependencyObject d, IEnumerable value)
        {
            d.SetValue(SeriesSourceProperty, value);
        }
    
        #endregion
    
        #region DependentValueBinding
    
        public static readonly DependencyProperty DependentValueBindingProperty =
            DependencyProperty.RegisterAttached("DependentValueBinding", 
                                                typeof(string), 
                                                typeof(ChartHelper),
                                                null);
    
        public static string GetDependentValueBinding(DependencyObject d)
        {
            return (string)d.GetValue(DependentValueBindingProperty);
        }
    
        public static void SetDependentValueBinding(DependencyObject d, string value)
        {
            d.SetValue(DependentValueBindingProperty, value);
        }
    
        #endregion
    
        #region IndependentValueBinding
    
        public static readonly DependencyProperty IndependentValueBindingProperty =
            DependencyProperty.RegisterAttached("IndependentValueBinding", 
                                                typeof(string), 
                                                typeof(ChartHelper),
                                                null);
    
        public static string GetIndependentValueBinding(DependencyObject d)
        {
            return (string)d.GetValue(IndependentValueBindingProperty);
        }
    
        public static void SetIndependentValueBinding(DependencyObject d, string value)
        {
            d.SetValue(IndependentValueBindingProperty, value);
        }
    
        #endregion
    
        #region Title
    
        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.RegisterAttached("Title", 
                                                typeof(string), 
                                                typeof(ChartHelper),
                                                null);
    
        public static string GetTitle(DependencyObject d)
        {
            return (string)d.GetValue(TitleProperty);
        }
    
        public static void SetTitle(DependencyObject d, string value)
        {
            d.SetValue(TitleProperty, value);
        }
    
        #endregion
    
        #region SeriesType
    
        public static readonly DependencyProperty SeriesTypeProperty =
            DependencyProperty.RegisterAttached("SeriesType", 
                                                typeof(SeriesType), 
                                                typeof(ChartHelper),
                                                new PropertyMetadata(SeriesType.Bar));
    
        public static SeriesType GetSeriesType(DependencyObject d)
        {
            return (SeriesType)d.GetValue(SeriesTypeProperty);
        }
    
        public static void SetSeriesType(DependencyObject d, SeriesType value)
        {
            d.SetValue(SeriesTypeProperty, value);
        }
    
        #endregion
    
        #region SeriesStyle
    
        public static readonly DependencyProperty SeriesStyleProperty =
            DependencyProperty.RegisterAttached("SeriesStyle", 
                                                typeof(Style), 
                                                typeof(ChartHelper),
                                                null);
    
        public static Style GetSeriesStyle(DependencyObject d)
        {
            return (Style)d.GetValue(SeriesStyleProperty);
        }
    
        public static void SetSeriesStyle(DependencyObject d, Style value)
        {
            d.SetValue(SeriesStyleProperty, value);
        }
    
        #endregion
    
        private static void SeriesSourceChanged(DependencyObject d, 
                                                DependencyPropertyChangedEventArgs e)
        {
            if(!(d is Chart))
            {
                throw new Exception("Series attached property only works on a Chart type");
            }
    
            var chart = d as Chart;
    
            /* Clear out any old series in the chart */
            chart.Series.Clear();
    
            /* Get our collection of data we need for each series */
            var chartSeriesSource = e.NewValue as IEnumerable;
    
            if(chartSeriesSource == null)
                throw new Exception("The SeriesSource does not support IEnumerable");
    
            /* Loop over each collection of data */
            foreach(var dataSource in chartSeriesSource)
            {
                DynamicSeries series;
    
                /* Find out what type of series we want to use */
                var seriesType = GetSeriesType(chart);
    
                switch(seriesType)
                {
                    case SeriesType.Line:
                        series = new LineSeries();
                        break;
                    case SeriesType.Bar:
                        series = new BarSeries();
                        break;
                    case SeriesType.Column:
                        series = new ColumnSeries();
                        break;
                    case SeriesType.Pie:
                        series = new PieSeries();
                        break;
                    case SeriesType.Scatter:
                        series = new ScatterSeries();
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
    
                /* Get and set the style of the newly created series */
                var seriesStyle = GetSeriesStyle(chart);
                series.Style = seriesStyle;
                
                string titleBindingName = GetTitle(chart);
                
                if (!string.IsNullOrEmpty(titleBindingName))
                {
                    /* Do some binding of the Title property */
                    var titleBinding = new Binding(titleBindingName)
                    {
                        Source = series.Title, Mode = BindingMode.TwoWay
                    };
    
                    series.SetBinding(Series.TitleProperty, titleBinding);
                }
    
                /* Setup the bindings configured in the attached properties */
                series.DependentValueBinding = new Binding(GetDependentValueBinding(chart));
                series.IndependentValueBinding = new Binding(GetIndependentValueBinding(chart));
    
                /*Set the ItemsSource property, which gives the data to the series to be rendered */
                series.ItemsSource = dataSource as IEnumerable;
    
                /* Add the series to the chart */
                chart.Series.Add(series);
            }
        }
    }
  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/HQFZ/p/4449675.html
Copyright © 2011-2022 走看看