代码之家  ›  专栏  ›  技术社区  ›  roh

自定义silverlight图表中的数据点

  •  4
  • roh  · 技术社区  · 17 年前

    我正在开发一个silverlight应用程序,它从web服务中提取对象,并根据对象属性动态填充图表(lineseries)。问题是,我在lineseries上有太多的数据点(点),我想知道是否有办法删除它们。

    我使用Setter来折叠数据点的可见性,但是我失去了当数据点可见时得到的自动工具提示(属性值)。。有没有办法在不查看数据点的情况下重新获得工具提示。

    罗恩

    2 回复  |  直到 17 年前
        1
  •  2
  •   Jeff Wilcox    17 年前

    几个月前我就遇到了这个问题。

    为了我, 异常值 最初并不重要。所以我决定继续使用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" />
    

    希望这有帮助。

        2
  •  0
  •   SmartyP    17 年前

    您可以设置数据点的样式,使其不至于太大,也可以使所有数据点的工具提示仍然存在,或者您可以将数据点过滤到较小的集合中,而不使用工具提示(因为您已删除了数据点)-这两种方式都无法实现。。也许你应该试试线样式的图形?