 <p>You should use data binding and INotifyPropertyChanged instead and let the framework control the rendering. I have a simple example to show how display a simple graph. <img src="https://i.stack.imgur.com/4Y5iP.png" alt="enter image description here"></p> <p><strong>GraphControl.xaml</strong></p> <pre><code> &lt;Border Height="50" Width="200" BorderBrush="Black" CornerRadius="1" BorderThickness="0.1"&gt; &lt;Canvas x:Name="canvas" Background="White" Margin="0" ClipToBounds="True" /&gt; &lt;/Border&gt; </code></pre> <p><strong>GraphControl.xaml.cs</strong></p> <pre><code> public partial class GraphControl : UserControl { public IEnumerable&lt;double&gt; Data { get { return (IEnumerable&lt;double&gt;)GetValue(DataProperty); } set { SetValue(DataProperty, value); } } public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(IEnumerable&lt;double&gt;), typeof(GraphControl), new PropertyMetadata(null, OnDataChanged)); private static void OnDataChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) { var control = (GraphControl)dependencyObject; control.HandleDataChanged(); } public Brush Color { get { return (Brush)GetValue(ColorProperty); } set { SetValue(ColorProperty, value); } } public static readonly DependencyProperty ColorProperty = DependencyProperty.Register("Color", typeof(Brush), typeof(GraphControl), new PropertyMetadata(Brushes.Green)); public double Maximum { get { return (double)GetValue(MaximumProperty); } set { SetValue(MaximumProperty, value); } } public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(GraphControl), new PropertyMetadata(100.0)); private void HandleDataChanged() { var points = new PointCollection(); double x = 0; points.Add(new Point(0, canvas.ActualHeight)); var xScale = canvas.ActualWidth / (Data.Count() -1); var yScale = canvas.ActualHeight / Maximum; foreach (var dataPoint in Data) { var y = canvas.ActualHeight - dataPoint * yScale; points.Add(new Point(x,y)); x += xScale; } points.Add(new Point(canvas.ActualWidth, canvas.ActualHeight)); var fill = Color.Clone(); fill.Opacity = 0.2; polygon.Stroke = Color; polygon.Fill = fill; polygon.Points = points; } Polygon polygon = new Polygon() ; public GraphControl() { InitializeComponent(); var fill = Color.Clone(); fill.Opacity = 0.2; polygon.Stroke = Color; polygon.Fill = fill; polygon.StrokeThickness = 1; canvas.Children.Add(polygon); } } </code></pre> <p>And for testing... <strong>MainWindows.xaml</strong></p> <pre><code> DataContext="{Binding RelativeSource={RelativeSource Self}}" &lt;StackPanel &gt; &lt;simpleGraph:GraphControl Data="{Binding Data}" Margin="4" /&gt; &lt;simpleGraph:GraphControl Data="{Binding Data}" Margin="4" /&gt; &lt;simpleGraph:GraphControl Data="{Binding Data}" Margin="4" /&gt; &lt;simpleGraph:GraphControl Data="{Binding Data}" Margin="4" /&gt; &lt;simpleGraph:GraphControl Data="{Binding Data}" Margin="4" /&gt; &lt;simpleGraph:GraphControl Data="{Binding Data}" Margin="4" /&gt; &lt;simpleGraph:GraphControl Data="{Binding Data}" Margin="4" /&gt; &lt;/StackPanel&gt; </code></pre> <p><strong>MainWindows.xaml.cs</strong></p> <pre><code>private Random random = new Random(); public List&lt;double&gt; Data { get; set; } public MainWindow() { InitializeComponent(); var temp = new List&lt;double&gt;(); for (int i = 0; i &lt; 100; i++) { temp.Add(random.NextDouble() * 100); } Data = new List&lt;double&gt;(temp); RaisePropertyChanged("Data"); Timer timer = new Timer(1); timer.Elapsed += (sender, args) =&gt; { UpdateData(); }; timer.Start(); } private void UpdateData() { var data = Data.ToArray(); ShiftLeft(data, 1); var value = random.NextDouble() * 100; data[99] = value; Data = new List&lt;double&gt;(data); RaisePropertyChanged("Data"); } public void ShiftLeft&lt;T&gt;(T[] array, int shifts) { Array.Copy(array, shifts, array, 0, array.Length - shifts); Array.Clear(array, array.Length - shifts, shifts); } private void RaisePropertyChanged(string property) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(property)); } public event PropertyChangedEventHandler PropertyChanged; </code></pre> <p>It´s very crude but hope it helps</p>