zoukankan      html  css  js  c++  java
  • Silverlight Chart 综合运用(样式、多轴、数据绑定、点状图、线形图、DataGrid、Chart导出综合运用)

    前面的文章,我们已经介绍过样式、数据绑定、点状图、线形图在Silverlight中的基本运用方法。这一章,我们将之前的内容融合起来,并进行一定的扩展。

    在下面,我们将实现下图功能:

    该图呈现的是一个典型的SQC图(Statistical Quality Control) 图中包含以下内容:

    1、Chart、Legend、点、线、的样式设置。

    2、多Y轴。图中设置了两个Y轴,第一轴(左) 与数据标准线绑定,显示标准值区间。第二轴(右)与采样点绑定,显示采样数值区间。取样数据。

    3、Chart中的Series_SelectionChanged事件,与DataGrid联动。

    4、数据标准线。本图中有四条,分别为Warning Limit Up/Warning Limit Low 和 Control Limit Up/Control Limit Low。

    5、图中显示了被选择的8个采样点,他们的值分别分布在被数据标准线划分的几个区间内。

    6、Chart的导出。(导出功能的实现请看这里)

    第一步:在页面上加载需要的控件

    我们在页面上放置一个Chart控件,一个DataGrid,一对Button,然后对Chart的每个列进行数据绑定设置。

    代码
    <navigation:Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable
    ="d"
    xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
    x:Class
    ="MySilverlightTest.Control_ChartMultipleAxis"
    Title
    =""
    d:DesignWidth
    ="1024" d:DesignHeight="768"
    xmlns:sdk
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
    xmlns:toolkit
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
    xmlns:toolkitChart
    ="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
    >
    <Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
    <RowDefinition Height="493*"/>

    </Grid.RowDefinitions>
    <toolkitChart:Chart Height="620" HorizontalAlignment="Left" Margin="12,16,0,0" Name="chart" VerticalAlignment="Top" Width="987" BorderThickness="0"></toolkitChart:Chart>
    <sdk:DataGrid IsReadOnly="True" ItemsSource="{Binding}" AutoGenerateColumns="False" HorizontalAlignment="Left" Name="dataGrid1" Width="851" Margin="39,623,0,0" CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserSortColumns="False" ColumnWidth="100" Height="59" VerticalAlignment="Top">
    <sdk:DataGrid.Columns>
    <sdk:DataGridTextColumn Binding="{Binding Local}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Time" Width="120"/>
    <sdk:DataGridTextColumn Binding="{Binding AnalyzerComponent}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Analyzer &amp; Component" Width="150"/>
    <sdk:DataGridTextColumn Binding="{Binding Description}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Description" Width="150"/>
    <sdk:DataGridTextColumn Binding="{Binding Value}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Value" Width="50"/>
    <sdk:DataGridTextColumn Binding="{Binding Quality}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Quality" Width="70"/>
    <sdk:DataGridTextColumn Binding="{Binding Unit}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Unit" Width="80"/>
    <sdk:DataGridTextColumn Binding="{Binding EngineeringLow}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Engineering Low" Width="Auto"/>
    <sdk:DataGridTextColumn Binding="{Binding EngineeringHigh}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Engineering High" Width="Auto"/>
    </sdk:DataGrid.Columns>
    </sdk:DataGrid>
    <Button Content="Export" Height="22" HorizontalAlignment="Left" Margin="373,700,0,0" Name="btnExport" VerticalAlignment="Top" Width="65" Click="btnExport_Click"/>
    <Button Content="Close" Height="22" HorizontalAlignment="Left" Margin="554,700,0,0" Name="btnClose" VerticalAlignment="Top" Width="65"/>
    </Grid>
    </navigation:Page>

    然后就需要在后台对数据以及Chart中的各各对象进行设置了。

    为点、线、Chart、第二Y轴、Legend定义样式 (关于样式的基本使用方法请看这里这里)

    1 //Chart样式
    2   Style ChartAreaStyle =new System.Windows.Style();
    3 ChartAreaStyle.TargetType =typeof(System.Windows.Controls.Grid);
    4
    5 //分别对四条线(两种类型)设置样式
    6   Style controlLimitStyle =new System.Windows.Style();
    7 controlLimitStyle.TargetType =typeof(System.Windows.Controls.Control);
    8
    9 Style warningLimitStyle =new System.Windows.Style();
    10 warningLimitStyle.TargetType =typeof(System.Windows.Controls.Control);
    11
    12 //设置线形图中点的样式
    13   Style dataPointStyle =new System.Windows.Style();
    14 dataPointStyle.TargetType =typeof(System.Windows.Controls.Control);
    15
    16 Style hideStyle =new System.Windows.Style();
    17 hideStyle.TargetType =typeof(System.Windows.Controls.Control);
    18
    19 //设置时间的显示格式
    20   Style timeStyle =new System.Windows.Style();
    21 timeStyle.TargetType =typeof(System.Windows.Controls.Control);
    22
    23 //为Style设置Setter
    24   Setter controlLimitsetterTemplate =new Setter(System.Windows.Controls.Control.TemplateProperty, null);
    25 Setter warningLimitsetterTemplate =new Setter(System.Windows.Controls.Control.TemplateProperty, null);
    26 Setter setterBlue =new Setter(System.Windows.Controls.Control.BackgroundProperty, new SolidColorBrush(Colors.Blue));
    27 Setter setterGreen =new Setter(System.Windows.Controls.Control.BackgroundProperty, new SolidColorBrush(Color.FromArgb(255, 0, 255, 0)));
    28 Setter setterRed =new Setter(System.Windows.Controls.Control.BackgroundProperty, new SolidColorBrush(Colors.Red));
    29 Setter setterHide =new Setter(System.Windows.Controls.Control.VisibilityProperty, Visibility.Collapsed);
    30 Setter setterArea =new Setter(Grid.BackgroundProperty, new SolidColorBrush(Color.FromArgb(255, 255, 255, 180)));
    31 Setter setterTime =new Setter(AxisLabel.StringFormatProperty, "{0:HH:mm}");
    32
    33 dataPointStyle.Setters.Add(setterBlue);
    34 warningLimitStyle.Setters.Add(warningLimitsetterTemplate);
    35 controlLimitStyle.Setters.Add(controlLimitsetterTemplate);
    36 warningLimitStyle.Setters.Add(setterGreen);
    37 controlLimitStyle.Setters.Add(setterRed);
    38 hideStyle.Setters.Add(setterHide);
    39 ChartAreaStyle.Setters.Add(setterArea);
    40 timeStyle.Setters.Add(setterTime);

    定义X轴,Y轴和第二Y轴。

    1 //定义X轴
    2   IAxis dateAxis =new DateTimeAxis { Orientation = AxisOrientation.X, Title ="时间", IntervalType = DateTimeIntervalType.Minutes, Interval =30, AxisLabelStyle = timeStyle };
    3 //定义Y轴
    4   IAxis valueAxis =new LinearAxis { Orientation = AxisOrientation.Y, Location = AxisLocation.Left, Title ="Lines", Minimum =-10, Maximum =10, ShowGridLines =true };
    5 //定义需要绑定的轴
    6   IRangeAxis rangeAxis =new LinearAxis
    7 {
    8 Orientation=AxisOrientation.Y,//指定为Y轴
    9   Location=AxisLocation.Right,//呈现在右侧
    10   Title ="Range Axis",
    11 FontSize =14,
    12
    13 //设置轴的区间
    14   Minimum =-20,
    15 Maximum =20,
    16
    17 //这里使用了两种方法设置颜色
    18   Background =new SolidColorBrush(Color.FromArgb(255, 255, 255, 100)),
    19 Foreground=new SolidColorBrush(Colors.Blue),
    20 };

    模拟数据

    代码
    1 Random random =new Random();
    2
    3 _dynamicDateItemsSource =new List<DateTimeValue>();
    4
    5 //准备数据
    6  for (int i =0; i <9; i++)
    7 {
    8 DateTimeValue lv =new DateTimeValue();
    9 lv.Datetime =new DateTime(2008, 10, 1, 13, 22, 5).AddHours(i);
    10 double rad = random.NextDouble();
    11 if (i%2==0)
    12 rad =-1* rad;
    13 double num = Math.Round(20* rad, 2);
    14 lv.Value = num;
    15 lv.Data =new List<PVData> {
    16 new PVData {
    17 Local ="Root.AREA5.PV"+ i,
    18 AnalyzerComponent ="52QA007 D-90",
    19 Description ="DISTLL'N 90% BP",
    20 Value =num,
    21 Quality ="GOOD",
    22 Unit ="degC",
    23 EngineeringLow = i*4+ i,
    24 EngineeringHigh = (i+1) *3-i,
    25 }
    26 };
    27 _dynamicDateItemsSource.Add(lv);
    28 }

    lines 4条线分别为 warnLimitUp/Low 和 controlLimitUp/Low

    1 LineSeries warnLimitUp =
    2 new LineSeries
    3 {
    4 ItemsSource = warningLimitUpDate,
    5 IndependentValueBinding =new Binding("Datetime"),
    6 DependentValueBinding =new Binding("Value"),
    7 Title ="Warning Limit",
    8 DataPointStyle = warningLimitStyle,
    9 LegendItemStyle = hideStyle,//隐藏不需要显示在Legend上的对象
    10   };
    11
    12 LineSeries warnLimitLow =
    13 new LineSeries
    14 {
    15 ItemsSource = warningLimitLowDate,
    16 IndependentValueBinding =new Binding("Datetime"),
    17 DependentValueBinding =new Binding("Value"),
    18 Title ="Warning Limit",
    19 DataPointStyle = warningLimitStyle
    20 };
    21
    22 LineSeries controlLimitUp =
    23 new LineSeries
    24 {
    25 ItemsSource = controlLimitUpDate,
    26 IndependentValueBinding =new Binding("Datetime"),
    27 DependentValueBinding =new Binding("Value"),
    28 Title ="Contrl Limit",
    29 DataPointStyle = controlLimitStyle,
    30 LegendItemStyle = hideStyle
    31 };
    32
    33 LineSeries controlLimitLow =
    34 new LineSeries
    35 {
    36 ItemsSource = controlLimitLowDate,
    37 IndependentValueBinding =new Binding("Datetime"),
    38 DependentValueBinding =new Binding("Value"),
    39 Title ="Contrl Limit",
    40 DataPointStyle = controlLimitStyle
    41 };

    对采样点设置样式,以及绑定到第二Y轴

    1 ScatterSeries scatterSeries =new ScatterSeries()
    2 {
    3 ItemsSource = _dynamicDateItemsSource,
    4 Title ="Validation Value",
    5 DataPointStyle = dataPointStyle,
    6 IsSelectionEnabled =true,
    7 IndependentValueBinding =new Binding("Datetime"),
    8 DependentValueBinding =new Binding("Value"),
    9 DependentRangeAxis = rangeAxis,//绑定的RangeAxis会自动显示在Chart中
    10   };
    11 //注册采样点被选中时的事件。

    12 scatterSeries.SelectionChanged +=new SelectionChangedEventHandler(scatterSeries_SelectionChanged);

    绑定数据到DataGrid

    1 void scatterSeries_SelectionChanged(object sender, SelectionChangedEventArgs e)
    2 {
    3 DateTimeValue dtv = e.AddedItems[0] as DateTimeValue;
    4 dataGrid1.DataContext = dtv.Data;
    5 }

    下面附上完整代码:

    代码
    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using System.Windows.Navigation;
    using System.Windows.Controls.DataVisualization.Charting;
    using System.Windows.Data;

    namespace MySilverlightTest
    {
    publicpartialclass Control_ChartMultipleAxis : Page
    {
    publicclass PVData
    {
    publicstring Local
    {
    get; set; }

    publicstring AnalyzerComponent
    {
    get; set; }

    publicstring Description
    {
    get; set; }

    publicdouble Value
    {
    get; set; }

    publicstring Quality
    {
    get; set; }

    publicstring Unit
    {
    get; set; }

    publicint EngineeringLow
    {
    get; set; }

    publicint EngineeringHigh
    {
    get; set; }

    }

    publicclass DateTimeValue
    {
    public DateTime Datetime
    {
    get;
    set;
    }

    publicdouble Value
    {
    get;
    set;
    }

    public List<PVData> Data
    {
    get; set; }
    }

    publicclass LineValue
    {
    public DateTime Datetime
    {
    get; set; }
    publicdouble Value
    {
    get; set; }
    }

    private List<DateTimeValue> _dynamicDateItemsSource =new List<DateTimeValue>();

    private List<LineValue> warningLimitUpDate =new List<LineValue>
    {
    new LineValue{ Datetime=new DateTime(2008, 10, 1,13,22,5),Value=4.0,},
    new LineValue{ Datetime=new DateTime(2008, 10, 1,22,22,5),Value=4.0},
    };
    private List<LineValue> warningLimitLowDate =new List<LineValue>
    {
    new LineValue{ Datetime=new DateTime(2008, 10, 1,13,22,5),Value=-4.0},
    new LineValue{ Datetime=new DateTime(2008, 10, 1,22,22,5),Value=-4.0},
    };
    private List<LineValue> controlLimitUpDate =new List<LineValue>
    {
    new LineValue{ Datetime=new DateTime(2008, 10, 1,13,22,5),Value=6},
    new LineValue{ Datetime=new DateTime(2008, 10, 1,22,22,5),Value=6},
    };
    private List<LineValue> controlLimitLowDate =new List<LineValue>
    {
    new LineValue{ Datetime=new DateTime(2008, 10, 1,13,22,5),Value=-6},
    new LineValue{ Datetime=new DateTime(2008, 10, 1,22,22,5),Value=-6},
    };

    public Control_ChartMultipleAxis()
    {
    InitializeComponent();
    Loaded
    +=new RoutedEventHandler(Control_ChartMultipleAxis_Loaded);
    }

    void Control_ChartMultipleAxis_Loaded(object sender, RoutedEventArgs e)
    {
    #region Styles
    //Chart样式
    Style ChartAreaStyle =new System.Windows.Style();
    ChartAreaStyle.TargetType
    =typeof(System.Windows.Controls.Grid);

    //分别对四条线(两种类型)设置样式
    Style controlLimitStyle =new System.Windows.Style();
    controlLimitStyle.TargetType
    =typeof(System.Windows.Controls.Control);

    Style warningLimitStyle
    =new System.Windows.Style();
    warningLimitStyle.TargetType
    =typeof(System.Windows.Controls.Control);

    //设置线形图中点的样式
    Style dataPointStyle =new System.Windows.Style();
    dataPointStyle.TargetType
    =typeof(System.Windows.Controls.Control);

    Style hideStyle
    =new System.Windows.Style();
    hideStyle.TargetType
    =typeof(System.Windows.Controls.Control);

    //设置时间的显示格式
    Style timeStyle =new System.Windows.Style();
    timeStyle.TargetType
    =typeof(System.Windows.Controls.Control);

    //为Style设置Setter
    Setter controlLimitsetterTemplate =new Setter(System.Windows.Controls.Control.TemplateProperty, null);
    Setter warningLimitsetterTemplate
    =new Setter(System.Windows.Controls.Control.TemplateProperty, null);
    Setter setterBlue
    =new Setter(System.Windows.Controls.Control.BackgroundProperty, new SolidColorBrush(Colors.Blue));
    Setter setterGreen
    =new Setter(System.Windows.Controls.Control.BackgroundProperty, new SolidColorBrush(Color.FromArgb(255, 0, 255, 0)));
    Setter setterRed
    =new Setter(System.Windows.Controls.Control.BackgroundProperty, new SolidColorBrush(Colors.Red));
    Setter setterHide
    =new Setter(System.Windows.Controls.Control.VisibilityProperty, Visibility.Collapsed);
    Setter setterArea
    =new Setter(Grid.BackgroundProperty, new SolidColorBrush(Color.FromArgb(255, 255, 255, 180)));
    Setter setterTime
    =new Setter(AxisLabel.StringFormatProperty, "{0:HH:mm}");

    dataPointStyle.Setters.Add(setterBlue);
    warningLimitStyle.Setters.Add(warningLimitsetterTemplate);
    controlLimitStyle.Setters.Add(controlLimitsetterTemplate);
    warningLimitStyle.Setters.Add(setterGreen);
    controlLimitStyle.Setters.Add(setterRed);
    hideStyle.Setters.Add(setterHide);
    ChartAreaStyle.Setters.Add(setterArea);
    timeStyle.Setters.Add(setterTime);

    #endregion

    //定义X轴
    IAxis dateAxis =new DateTimeAxis { Orientation = AxisOrientation.X, Title ="时间", IntervalType = DateTimeIntervalType.Minutes, Interval =30, AxisLabelStyle = timeStyle };
    //定义Y轴
    IAxis valueAxis =new LinearAxis { Orientation = AxisOrientation.Y, Location = AxisLocation.Left, Title ="Lines", Minimum =-10, Maximum =10, ShowGridLines =true };
    //定义需要绑定的轴
    IRangeAxis rangeAxis =new LinearAxis
    {
    Orientation
    =AxisOrientation.Y,//指定为Y轴
    Location=AxisLocation.Right,//呈现在右侧
    Title ="Range Axis",
    FontSize
    =14,

    //设置轴的区间
    Minimum =-20,
    Maximum
    =20,

    //这里使用了两种方法设置颜色
    Background =new SolidColorBrush(Color.FromArgb(255, 255, 255, 100)),
    Foreground
    =new SolidColorBrush(Colors.Blue),
    };

    Random random
    =new Random();

    _dynamicDateItemsSource
    =new List<DateTimeValue>();

    //准备数据
    for (int i =0; i <9; i++)
    {
    DateTimeValue lv
    =new DateTimeValue();
    lv.Datetime
    =new DateTime(2008, 10, 1, 13, 22, 5).AddHours(i);
    double rad = random.NextDouble();
    if (i%2==0)
    rad
    =-1* rad;
    double num = Math.Round(20* rad, 2);
    lv.Value
    = num;
    lv.Data
    =new List<PVData> {
    new PVData {
    Local
    ="Root.AREA5.PV"+ i,
    AnalyzerComponent
    ="52QA007 D-90",
    Description
    ="DISTLL'N 90% BP",
    Value
    =num,
    Quality
    ="GOOD",
    Unit
    ="degC",
    EngineeringLow
    = i*4+ i,
    EngineeringHigh
    = (i+1) *3-i,
    }
    };
    _dynamicDateItemsSource.Add(lv);
    }

    #region lines 4条线分别为 warnLimitUp/Low 和 controlLimitUp/Low

    LineSeries warnLimitUp
    =
    new LineSeries
    {
    ItemsSource
    = warningLimitUpDate,
    IndependentValueBinding
    =new Binding("Datetime"),
    DependentValueBinding
    =new Binding("Value"),
    Title
    ="Warning Limit",
    DataPointStyle
    = warningLimitStyle,
    LegendItemStyle
    = hideStyle,//隐藏不需要显示在Legend上的对象
    };

    LineSeries warnLimitLow
    =
    new LineSeries
    {
    ItemsSource
    = warningLimitLowDate,
    IndependentValueBinding
    =new Binding("Datetime"),
    DependentValueBinding
    =new Binding("Value"),
    Title
    ="Warning Limit",
    DataPointStyle
    = warningLimitStyle
    };

    LineSeries controlLimitUp
    =
    new LineSeries
    {
    ItemsSource
    = controlLimitUpDate,
    IndependentValueBinding
    =new Binding("Datetime"),
    DependentValueBinding
    =new Binding("Value"),
    Title
    ="Contrl Limit",
    DataPointStyle
    = controlLimitStyle,
    LegendItemStyle
    = hideStyle
    };

    LineSeries controlLimitLow
    =
    new LineSeries
    {
    ItemsSource
    = controlLimitLowDate,
    IndependentValueBinding
    =new Binding("Datetime"),
    DependentValueBinding
    =new Binding("Value"),
    Title
    ="Contrl Limit",
    DataPointStyle
    = controlLimitStyle
    };

    #endregion

    ScatterSeries scatterSeries
    =new ScatterSeries()
    {
    ItemsSource
    = _dynamicDateItemsSource,
    Title
    ="Validation Value",
    DataPointStyle
    = dataPointStyle,
    IsSelectionEnabled
    =true,
    IndependentValueBinding
    =new Binding("Datetime"),
    DependentValueBinding
    =new Binding("Value"),
    DependentRangeAxis
    = rangeAxis,//绑定的RangeAxis会自动显示在Chart中
    };
    scatterSeries.SelectionChanged
    +=new SelectionChangedEventHandler(scatterSeries_SelectionChanged);

    chart.Title
    =null;

    chart.Series.Add(warnLimitUp);
    chart.Series.Add(warnLimitLow);
    chart.Series.Add(controlLimitUp);
    chart.Series.Add(controlLimitLow);
    chart.Series.Add(scatterSeries);
    chart.PlotAreaStyle
    = ChartAreaStyle;

    chart.Axes.Add(dateAxis);
    chart.Axes.Add(valueAxis);
    }

    void scatterSeries_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    DateTimeValue dtv
    = e.AddedItems[0] as DateTimeValue;
    dataGrid1.DataContext
    = dtv.Data;
    }

    privatevoid btnExport_Click(object sender, RoutedEventArgs e)
    {
    ElementToPNG eTP
    =new ElementToPNG();
    eTP.ShowSaveDialog(chart);
    }

    // Executes when the user navigates to this page.
    protectedoverridevoid OnNavigatedTo(NavigationEventArgs e)
    {
    }

    }
    }
  • 相关阅读:
    魔术方法详解、魔术变量、预定义常量、预定义变量
    RabbitMQ:生产者消费者模型构建/为消息自定义属性/自定义消费者
    RabbitMQ:相关概念
    RabbitMQ:基于centos7安装
    Spring Boot:整合Dubbo
    Dubbo:服务提供者、消费者相关配置
    Dubbo:Dubbo Admin环境搭建
    Zookeeper:Curator Watcher机制和事务控制
    Zookeeper:Curator增删改查API
    Zookeeper:集群和zab协议
  • 原文地址:https://www.cnblogs.com/hades/p/1798674.html
Copyright © 2011-2022 走看看