WPF Polyline chart

Obiettivo - Premssa

In questo post mostrerò step by step come creare un grafico usando C#, la classe polyline e gli stili di wpf sfruttando xaml come linguaggio di markup. Per ulteriori informazioni su wpf vi rimando a quest'interessante pagina web dal sito di msdn. A fine post riporto il codice del progetto mostrato.

1° Step

Incominciamo con il creare delle grid e una visualbox per rendere visibile il grafico che creeremo, quindi scriviamo queste righe di codice xaml

   1:  <Grid> 
   2:  <Viewbox Stretch="Fill"> 
   3:  <Grid x:Name="grid"></Grid > 
   4:  </Viewbox> 
   5:  </Grid>

Ok, adesso abbiamo i nostri contenitori, non ci manca che creare uno stile per quadrettare la grid principale, vediamo come farne uno con xaml

   1:  <DrawingBrush x:Key="quadrettatura" Viewport="0,0,10,10" 
   2:                           ViewportUnits="Absolute" TileMode="Tile"> 
   3:  <DrawingBrush.Drawing> 
   4:  <DrawingGroup> 
   5:  <DrawingGroup.Children> 
   6:  <GeometryDrawing Geometry="M0,0 L1,0 1,0.1, 0,0.1Z" Brush="Green" /> 
   7:  <GeometryDrawing Geometry="M0,0 L0,1 0.1,1, 0.1,0Z" Brush="Green" /> 
   8:  </DrawingGroup.Children> 
   9:  </DrawingGroup> 
  10:  </DrawingBrush.Drawing> 
  11:  </DrawingBrush>
  12:   
  13:  <Style x:Key="miostile" TargetType="{x:Type Grid}"> 
  14:  <Setter Property="Background" 
Value="{StaticResource gridBackgroundBrush}"/>
  15:  </Style>

Il codice appena scritto lo inseriamo tra i tag

   1:  <Window.Resources>codice</Window.Resources>

E lo poniamo in alto dopo l’intestazione della window, abbiamo appena creato uno stile per il backgound di una grid, adesso vediamo come applicare questo stile alla grid creata in partenza :

   1:  <Grid Style="{StaticResource miostile}"> 
   2:  <Viewbox Stretch="Fill"> 
   3:  <Grid x:Name="grid"></Grid > 
   4:  </Viewbox> 
   5:  </Grid>

Se tutto è stato fatto come indicato, dovreste avere questo risultato

quadrettatura

2° Step

Incominciamo con le seguenti dichiarazioni

   1:  Polyline polilinea; 
   2:  DispatcherTimer timer = new DispatcherTimer(); 
   3:  Random rand = new Random(DateTime.Now.Millisecond); 
   4:  int x = 0; 
   5:  int passo = 10;

Settiamo adesso alcune proprietà alla polilinea, indichiamo dove disegnarla e diamo le impostazioni al timer:

   1:  public Window1() 
   2:  { 
   3:  InitializeComponent(); 
   4:  polilinea = new Polyline(); 
   5:  polilinea.Stroke = System.Windows.Media.Brushes.Yellow; 
   6:  polilinea.StrokeThickness = 1; 
   7:  polilinea.FillRule = FillRule.EvenOdd; 
   8:  polilinea.Stretch = Stretch.Fill; 
   9:  grid.Children.Add(polilinea); //disegnamo la polilinea sulla grid 
  10:  timer.Interval = TimeSpan.FromMilliseconds(500); 
  11:  timer.Tick += new EventHandler(timer_Tick); 
  12:  timer.Start(); 
  13:  }

Adesso non ci rimane che creare la funzione “timer_tick” che il timer invoca ad ogni scatto impostato:

   1:  private void timer_Tick(object sender, EventArgs e) 
   2:  { 
   3:  Point punto = new Point(x, rand.Next(1000)); 
   4:  x += passo; 
   5:  polilinea.Points.Add(punto); 
   6:  if(polilinea.Points.Count >= 15) 
   7:  { 
   8:  for (int i = 0; i < polilinea.Points.Count; i++) 
   9:  { 
  10:  polilinea.Points.RemoveAt(i); 
  11:  } 
  12:  } 
  13:  }

OK! Adesso dovremmo avere questo risultato

grafico_thumb1

Conclusione

Abbiamo creato un grafico sfruttando la classe polyline del .net 3.0, la classe polyline si presta benissimo per il risultato che ci ervamo prefissi, a partire da questo esempio di possono creare tante altre cose interessanti.


Technorati Tag: ,,,

posted @ mercoledì 30 luglio 2008 12.45

Print

Comments on this entry:

# re: WPF Polyline chart

Left by Luca Maraschi at 30/07/2008 15.56
Gravatar
Grande Fabrizio...mi ricordano qualcosa o sbaglio queste righe di codice?! ;-)

Molto interessante...;-)

# re: WPF Polyline chart

Left by Fabrizio Lapiello at 30/07/2008 16.01
Gravatar
:-) grazie... in effetti questo articolo deriva dal lavoro che ti feci vedere un pò di tempo fà, questo dovrebbe diventare (ovviamente deve essere ancora perfezionato) il grafico di riferimento per i consumi energetici nel DoMus project.

Your comment:



 (will not be displayed)


 
 
 
Please add 7 and 8 and type the answer here:
 

Live Comment Preview: