zoukankan      html  css  js  c++  java
  • 定义silverlight报表样式Styling a Silverlight Chart

    A article on how to style a standard Silverlight chart to look like the Google Analytics chart.

    GoogleAnalyticsGraph

    Introduction

    I love Google Analytics! I use it to monitor every site I own… Google’s chart looks very slick! Here is a walkthrough on how to style your Silverlight chart to look like the Google Analytics chart!

    Before we start

    We need some data. I created very basic TrafficInfo and TrafficInfoCollection objects with some dummy data that I can bind to.

    public class TrafficInfo
    {
    public DateTime Date { get; set; }
    public int Visits { get; set; }
    }

    We also need the Silverlight Toolkit (I used the port to WPF created by Jaime Rodriquez).

    Let's start with the basics

    Add the following two namespaces:

    xmlns:charting="clr-namespace:Microsoft.Windows.Controls.DataVisualization.
    Charting;assembly=Microsoft.Windows.Controls.DataVisualization"
    xmlns:datavis="clr-namespace:Microsoft.Windows.Controls.DataVisualization;
    assembly=Microsoft.Windows.Controls.DataVisualization"

    Now, let's create a simple line chart:

    <charting:Chart Width="800" Height="175">
    <charting:Chart.Series>
    <charting:LineSeries IsSelectionEnabled="True"
    Title="Visits"
    ItemsSource="{StaticResource TrafficInfo}"
    IndependentValueBinding="{Binding Date}"
    DependentValueBinding="{Binding Visits}" />
    </charting:Chart.Series>
    </charting:Chart>

    And here is our master piece:

    SilverlightChartTry1.jpg

    Not bad, but…

    Style, style, style

    Let's start styling our chart… I will split the styling into two parts; the first part will be specific to line charts, and the second part might be relevant to other types of charts too…

    Styling the LineSeries

    Each LineSeries has a PolylineStyle property. The PolylineStyle controls how the line looks. Here is our GooglePolylineStyle:

    <Style x:Key="GooglePolylineStyle" TargetType="Polyline">
    <Setter Property="StrokeThickness" Value="5"/>
    </Style>

    And, here is the style for the LineDataPoint:

    <Style x:Key="GoogleLineDataPointStyle" TargetType="charting:LineDataPoint">
    <Setter Property="Background" Value="#0077CC" />
    <Setter Property="BorderBrush" Value="White"/>
    <Setter Property="BorderThickness" Value="2"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="charting:LineDataPoint">
    <Grid x:Name="Root" Opacity="1">
    <ToolTipService.ToolTip>
    <StackPanel Margin="2,2,2,2">
    <ContentControl Content="{TemplateBinding IndependentValue}"
    ContentStringFormat="{}{0:MMMM d, yyyy}"/>
    <ContentControl Content="{TemplateBinding DependentValue}"
    ContentStringFormat="Visits {0:###,###,###}"/>
    </StackPanel>
    </ToolTipService.ToolTip>
    <Ellipse StrokeThickness="{TemplateBinding BorderThickness}"
    Stroke="{TemplateBinding BorderBrush}"
    Fill="{TemplateBinding Background}"/>
    </Grid>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Style>

    Also update the chart’s LineSeries to use our newly created styles:

    <charting:LineSeries IsSelectionEnabled="True"
    PolylineStyle="{StaticResource GooglePolylineStyle}"
    DataPointStyle="{StaticResource GoogleLineDataPointStyle}"
    MarkerHeight="10" MarkerWidth="10"
    Title="Visits"
    ItemsSource="{StaticResource TrafficInfo}"
    IndependentValueBinding="{Binding Date}"
    DependentValueBinding="{Binding Visits}" />

    And, here is the result:

    GoogleLineDataPoint.jpg

    There are a few things to notice here. Each DataPoint has the following properties you can use and display in your tooltip:

    • DependentValue
    • FormattedDependentValue
    • IndependentValue
    • FormattedIndependentValue

    Each LineSeries can specify the DataPoint marker size using MarkerWidth and MarkerHeight.

    Styling the chart

    I want to remove the title and the ledger of the chart. There are two options to removing these items! You can create new styles for the title and the ledger that sets its visibility to Collapsed. (This trick also works if you don’t want DataPointmarkers.)

    <Style x:Key="GoogleNoTitle" TargetType="datavis:Title">
    <Setter Property="Visibility" Value="Collapsed"/>
    </Style>

    Then, just set the TitleStyle and LedgerStyle properties on the chart:

    TitleStyle="{StaticResource GoogleNoTitle}"

    The seconds method of removing these is to rather create a new ControlTemplate for the chart and remove them permanently!

    <Style x:Key="GoogleChart" TargetType="charting:Chart">
    <Setter Property="PlotAreaStyle">
    <Setter.Value>
    <Style TargetType="Grid">
    <Setter Property="Background" Value="White" />
    </Style>
    </Setter.Value>
    </Setter>
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="charting:Chart">
    <Border
    Background="{TemplateBinding Background}"
    BorderBrush="{TemplateBinding BorderBrush}"
    BorderThickness="{TemplateBinding BorderThickness}"
    Padding="10">
    <Grid>
    <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid Grid.Row="1" Margin="0,15,0,15">
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid x:Name="ChartArea"
    Style="{TemplateBinding ChartAreaStyle}">
    <Grid x:Name="PlotArea"
    Style="{TemplateBinding PlotAreaStyle}"
    Margin="0,0,0,0" >
    <Grid x:Name="GridLinesContainer" />
    <Grid x:Name="SeriesContainer" />
    <Border Margin="0,0,0,0"
    BorderBrush="#FF919191"
    BorderThickness="0,1,0,1"/>
    </Grid>
    </Grid>
    </Grid>
    </Grid>
    </Border>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Style>

    The new ControlTemplate merely removes the title and ledger! The last part of the chart we need to style are the axes. If you look at the Google chart, you will notice that the vertical grid lines indicate where a week starts; how difficult would this be?

    Each chart has an Axes property, which can contain multiple axis! Here are some of the axis properties I used:

    LabelStringFormatMMMM d, yyyyChanges the format of the labels
    ShowGridLinesTrueShows the grid lines
    ShowTickMarksTrueShows the grid line markers
    ShouldIncludeZeroTrueScales from 0
    IntervalTypeDaysIndicates what each unit on the axis is
    Interval7Interval between points on the axis
    IntervalOffset1Offset used in creating the axis
    IntervalOffsetTypeDaysOffset type

    Here is the markup:

    <charting:Chart.Axes>
    <charting:Axis Orientation="Horizontal"
    AxisType="DateTime" ShowGridLines="True"
    ShowTickMarks="True" LabelStringFormat="MMMM d, yyyy"
    IntervalType="Days" Interval="7"
    IntervalOffset="1" IntervalOffsetType="Days"
    Style="{StaticResource GoogleAxisStyle}" />
    <charting:Axis Orientation="Vertical" AxisType="Linear" ShowTickMarks="False"
    Interval="4000" IntervalType="Number"
    ShowGridLines="True" ShouldIncludeZero="True"
    Style="{StaticResource GoogleAxisStyle}"/>
    </charting:Chart.Axes>

    And that is it.

    SilverlightChartDone.jpg

    The Silverlight Toolkit Chart control is very flexible and powerful! Try it out, and you will be surprised at the endless ways you can style it!

    If you found this article useful or interesting, please vote for it!

    License

    This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

    http://www.codeproject.com/KB/WPF/WPFSLChart.aspx?display=Print 


  • 相关阅读:
    ocx文件转换成C#程序引用的DLL
    CSS颜色代码 颜色值 颜色名字大全(转载)
    WinForm轻松实现自定义分页 (转载)
    如何:使用PicturBox实现类似淘宝网站图片的局部放大功能
    转载jQuery图片放大插件[twiPicZoom]
    LINQ查询返回DataTable类型
    最喜欢的VS 键盘快捷键摘抄
    Codeforces Round #336 (Div. 2)B 暴力 C dp D 区间dp
    Educational Codeforces Round 24 A 水 B stl C 暴力 D stl模拟 E 二分
    poj 1185 状态压缩
  • 原文地址:https://www.cnblogs.com/guanjie20/p/1785491.html
Copyright © 2011-2022 走看看