2009-07-24 4 views
4

Я работаю над приложением silverlight, которое извлекает объекты из веб-службы и динамически заполняет диаграмму (lineseries) на основе атрибутов объекта. Проблема в том, что у меня слишком много точек данных (точек) на линиях, и мне было интересно, есть ли способ их удалить.Настройка Datapoints в диаграммах silverlight

Я использовал Setter, чтобы скрыть видимость данных, но я потерял автоматическую подсказку (значение атрибута), которую я получил, когда точки данных были видны. Есть ли способ восстановить всплывающую подсказку, не видя точки данных.

Благодаря Рон

PS: XAML просто определяет диаграмму, все остальное делается в сСт

ответ

0

Вы можете либо стиль точки данных таким образом, чтобы они не так велики, и в пути так что у вас все еще есть всплывающие подсказки для всех точек данных, или вы можете отфильтровать свои точки данных в меньшую коллекцию и не иметь всплывающих подсказок (потому что вы избавились от точек данных) - вы не можете иметь ее в обоих направлениях. Возможно, вам стоит попробовать график стиля линии?

+0

Спасибо ... но варианты 2 и 3 действительно возможны. Я относительно новичок в Silverlight и задавался вопросом, есть ли способ изменить шаблон LineDataPoint, чтобы сделать точку данных прозрачной (если возможно). Это может быть длинный, но, если это возможно, как я могу убедиться, что мой код позади использует шаблон, определенный в page.xaml ?? – 2009-07-24 15:27:55

2

У меня была эта точная проблема несколько месяцев назад.

Для меня outliners изначально не были важны. Поэтому я решил пойти дальше и использовать LINQ, чтобы просмотреть список. Достаточно просто предоставить предложение .Where (...) или использовать lambdas, чтобы выбрать подмножество списка - все N записей или любую другую запись в списке.

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

Если outliners важны, вам может понадобиться, чтобы написать простой алгоритм, который фильтрует просмотреть список вниз несколько.

Вот еще один простой код (не очень красивый), который я должен был написать для графика. Извините за то, что вы не очень упрощаете код, комментируйте, если вам нужны детали или объект данных.

Я измерял размер контрольных сборок с течением времени и сопоставлял это с датами сборки/временем/и проверками.

Для этого приложения я хотел показать изменений в данных, так как у меня было много избыточных точек. Это были точки перегиба.

Представьте себе, что у вас есть 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); 
      } 
     } 

И, наконец, если вы хотите настроить шаблоны DataPoint, он может сделать это, но, на мой взгляд, это не тривиально.

У вас есть много общего, например,

  • Определение надлежащего типа точки (я использую LineDataPoints здесь)
  • Setup палитру стилей, чтобы выбрать один из ваших стилей точек, которые включают в себя, что изготовленный на заказ шаблон

Это положительный результат, если вам нужно сделать много настроек. Вы могли бы, например, сделать всю точку данных прозрачной.

Это настраиваемый шаблон (извините, очень многословный) для элемента управления диаграммой LineDataPoint (элементы управления Silverlight Toolkit), который имеет настраиваемую привязку ToolTip, связанный цвет для точки и другие свойства, которые относятся к одной и той же точке данных из код фильтра выше.

я удалил визуальные состояния от этого 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> 

И в XAML, который связывает палитру стилей:

  <charting:Chart 

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

      x:Name="CompressedSizes" /> 

Надеюсь, это поможет.

Смежные вопросы