gpt4 book ai didi

silverlight - 在 silverlight 图表中自定义数据点

转载 作者:行者123 更新时间:2023-12-01 04:21:54 26 4
gpt4 key购买 nike

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

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

谢谢
罗恩

PS:XAML 只是定义了图表,其他的都在 cs 中完成

最佳答案

几个月前我遇到了这个确切的问题。

对我来说,大纲 最初并不重要。所以我决定继续使用 LINQ 来减少列表。提供 .Where(...) 子句或使用 lambda 来选择列表的子集应该很容易——每 N 个条目,或列表中的每个其他条目。

yourSeries.ItemsSource = blah.Where(x => x... /* insert expressions here to filter a little */)

如果 大纲很重要 ,您可能需要编写一个简单的算法来过滤 ListView 。

这是我必须为图表编写的一些简单代码(但不是很漂亮)。很抱歉没有简化代码,如果您需要详细信息或数据对象,请发表评论。

我一直在测量控制组件的大小,并将其与构建日期/时间/和 checkin 相关联。

对于这个应用程序,我想显示数据的变化,因为我有很多冗余点。这些是兴趣的转折点。

想象一下有 800 个构建和相关数据——但实际上只说 300 个有趣的数据点。那是更少的数据,并改善了显示。

我在下面解释一下代码。
        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);
}
}
}
}
}

_data 是我的程序集数据集,我最终用它来设置系列:
        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);
}
}

最后,如果您确实想 自定义数据点模板 ,它可以做到,但在我看来这不是微不足道的。

你有很多事情要做,比如
  • 定义正确的点类型(我在这里使用 LineDataPoints)
  • 设置样式调色板以从您的点样式中进行选择,其中包括自定义模板

  • 如果您需要进行大量定制,这是一个积极的方面。例如,您可以使整个数据点透明。

    这是 LineDataPoint(Silverlight Toolkit 图表控件)的自定义模板(抱歉,非常冗长),该模板具有自定义 ToolTip 绑定(bind)、点的绑定(bind)颜色以及与上述过滤器代码中的同一数据点相关的其他属性.

    我从这个 XAML 中删除了视觉状态来清理它
            <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>

    以及绑定(bind)样式调色板的 XAML:
                <charting:Chart

    Title="Compressed control sizes over time"
    StylePalette="{StaticResource MyCustomStylePalette}"

    x:Name="CompressedSizes" />

    希望这可以帮助。

    关于silverlight - 在 silverlight 图表中自定义数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1177611/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com