几个月前我就遇到了这个问题。
为了我,
异常值
最初并不重要。所以我决定继续使用LINQ来缩减列表。提供一个.Where(…)子句或使用lambdas来选择列表的一个子集应该很容易——每N个条目,或列表中的每个其他条目。
yourSeries.ItemsSource = blah.Where(x => x... /* insert expressions here to filter a little */)
如果
大纲视图很重要
,您可能需要编写一个简单的算法,对列表的视图进行过滤。
下面是一些我必须为图形编写的简单代码(但并不漂亮)。很抱歉没有太多地简化代码,如果需要详细信息,请进行注释,或者对数据对象进行注释。
我测量了控件程序集的大小,并将其与构建日期/时间/和签入相关联。
变化
在数据中,因为我有很多冗余点。这些是人们感兴趣的转折点。
private void ParseData(string xml)
{
XDocument data = XDocument.Parse(xml);
_data = new Dictionary<string, List<ControlAssembly>>();
foreach (XElement dataSet in data.Descendants("data"))
{
string set = dataSet.Attribute("set").Value;
long lastSize = 0;
int matchingSizeCount = 0;
foreach (XElement build in dataSet.Descendants("build"))
{
ControlAssembly ca = ControlAssembly.Parse(build);
if (ca != null)
{
List<ControlAssembly> list;
if (!_data.TryGetValue(set, out list))
{
_data[set] = new List<ControlAssembly>();
list = _data[set];
}
bool add = true;
if (ca.SizeInKilobytes == lastSize)
{
matchingSizeCount++;
if (matchingSizeCount > 1 && !ca.IsKnownReleaseWeek)
{
// cut down on the displayed data points
add = false;
}
}
else
{
matchingSizeCount = 0;
lastSize = ca.SizeInKilobytes;
}
if (add)
{
_data[set].Add(ca);
}
}
}
}
}
_数据是我的程序集数据集,我最终使用它来设置系列:
ParseData(SampleData.LargeDataSet);
_xapSeries = new Dictionary<string, LineSeries>();
foreach (string assembly in _data.Keys)
{
LineSeries series = new LineSeries();
series.Title = assembly.Replace(".dll", "");
series.IndependentValueBinding = new Binding("BuildDateTime");
series.DependentValueBinding = new Binding("CompressedSize");
series.MarkerHeight = 12;
series.MarkerWidth = 12;
series.ItemsSource = _data[assembly].ToList();
_xapSeries[assembly] = series;
if (assembly != "Total")
{
CompressedSizes.Series.Add(series);
}
}
最后,如果你真的想
自定义数据点模板
,这是可以做到的,但在我看来并非微不足道。
你有很多事情要做,比如
-
-
设置样式选项板以从点样式(包括该自定义模板)中选择
这是一个积极的,如果你需要做大量的定制。例如,可以使整个数据点透明。
下面是LineDataPoint(Silverlight Toolkit图表控件)的自定义模板(很抱歉,非常详细),该模板具有自定义工具提示绑定、点的绑定颜色以及与上面的过滤器代码中的相同数据点相关的其他属性。
<ControlTemplate x:Key="CustomLineDataPointTemplate" TargetType="charting:LineDataPoint">
<Grid x:Name="Root" Opacity="0" ToolTipService.ToolTip="{Binding DataPointTooltipText}">
<Ellipse Opacity="0.4" Stroke="{TemplateBinding BorderBrush}" Fill="{TemplateBinding Background}"/>
<Ellipse Opacity="0.4" RenderTransformOrigin="0.661,0.321">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.681,0.308">
<GradientStop Color="#00FFFFFF"/>
<GradientStop Color="#FF3D3A3A" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse StrokeThickness="2" Stroke="{Binding DataPointBrush}" />
<Ellipse x:Name="SelectionHighlight" Opacity="0" Fill="Red"/>
<Ellipse x:Name="MouseOverHighlight" Opacity="0" Fill="White"/>
</Grid>
</ControlTemplate>
<datavis:StylePalette x:Key="MyCustomStylePalette">
<!--Blue-->
<Style TargetType="charting:LineDataPoint">
<Setter Property="Background"><Setter.Value><RadialGradientBrush><RadialGradientBrush.RelativeTransform><TransformGroup><ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="2.09" ScaleY="1.819"/><TranslateTransform X="-0.425" Y="-0.486"/></TransformGroup></RadialGradientBrush.RelativeTransform><GradientStop Color="#FFB9D6F7"/><GradientStop Color="#FF284B70" Offset="1"/></RadialGradientBrush></Setter.Value></Setter>
<Setter Property="Template" Value="{StaticResource CustomLineDataPointTemplate}" />
</Style>
<!--Red-->
<Style TargetType="charting:LineDataPoint">
<Setter Property="Background"><Setter.Value><RadialGradientBrush><RadialGradientBrush.RelativeTransform><TransformGroup><ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="2.09" ScaleY="1.819"/><TranslateTransform X="-0.425" Y="-0.486"/></TransformGroup></RadialGradientBrush.RelativeTransform><GradientStop Color="#FFFBB7B5"/><GradientStop Color="#FF702828" Offset="1"/></RadialGradientBrush></Setter.Value></Setter>
<Setter Property="Template" Value="{StaticResource CustomLineDataPointTemplate}" />
</Style>
<!-- Light Green -->
<Style TargetType="Control">
<Setter Property="Background"><Setter.Value><RadialGradientBrush><RadialGradientBrush.RelativeTransform><TransformGroup><ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="2.09" ScaleY="1.819"/><TranslateTransform X="-0.425" Y="-0.486"/></TransformGroup></RadialGradientBrush.RelativeTransform><GradientStop Color="#FFB8C0AC"/><GradientStop Color="#FF5F7143" Offset="1"/></RadialGradientBrush></Setter.Value></Setter>
<Setter Property="Template" Value="{StaticResource CustomLineDataPointTemplate}" />
</Style>
<!-- Yellow -->
<Style TargetType="Control">
<Setter Property="Background"><Setter.Value><RadialGradientBrush><RadialGradientBrush.RelativeTransform><TransformGroup><ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="2.09" ScaleY="1.819"/><TranslateTransform X="-0.425" Y="-0.486"/></TransformGroup></RadialGradientBrush.RelativeTransform><GradientStop Color="#FFFDE79C"/><GradientStop Color="#FFF6BC0C" Offset="1"/></RadialGradientBrush></Setter.Value></Setter>
<Setter Property="Template" Value="{StaticResource CustomLineDataPointTemplate}" />
</Style>
<!-- Indigo -->
<Style TargetType="Control">
<Setter Property="Background"><Setter.Value><RadialGradientBrush><RadialGradientBrush.RelativeTransform><TransformGroup><ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="2.09" ScaleY="1.819"/><TranslateTransform X="-0.425" Y="-0.486"/></TransformGroup></RadialGradientBrush.RelativeTransform><GradientStop Color="#FFA9A3BD"/><GradientStop Color="#FF382C6C" Offset="1"/></RadialGradientBrush></Setter.Value></Setter>
<Setter Property="Template" Value="{StaticResource CustomLineDataPointTemplate}" />
</Style>
</datavis:StylePalette>
以及绑定样式调色板的XAML:
<charting:Chart
Title="Compressed control sizes over time"
StylePalette="{StaticResource MyCustomStylePalette}"
x:Name="CompressedSizes" />
希望这有帮助。