title: Update canvas in WPF
body: <p>I want to show the animation of my moving ant on the canvas. Therefore the position of an ellipse should be changed. The calculation of the steps works, but I can't show the change of the ellipse position in the MainWindow. Only after the calculation of all the ant steps is done, the canvas is shown.</p>
  
  <p>XAML-code:</p>
  
  <pre><code>&lt;Window x:Class="WpfApplication1.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          xmlns:local="clr-namespace:WpfApplication1"
          mc:Ignorable="d"
          Title="MainWindow" Height="350" Width="525"&gt;
      &lt;Canvas Name="myCanvas"&gt;
          &lt;Ellipse x:Name="ant1" Width="11" Height="11" Stroke="Black" Fill="Red"/&gt;
      &lt;/Canvas&gt;
  &lt;/Window&gt;
  </code></pre>
  
  <p>C#-code:</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  using System.Windows;
  using System.Windows.Controls;
  using System.Windows.Data;
  using System.Windows.Documents;
  using System.Windows.Input;
  using System.Windows.Media;
  using System.Windows.Media.Imaging;
  using System.Windows.Navigation;
  using System.Windows.Shapes;
  using System.Threading;
  using System.Diagnostics;
  using System.Windows.Threading;
  
  namespace WpfApplication1
  {
      /// &lt;summary&gt;
      /// Interaction logic for MainWindow.xaml
      /// &lt;/summary&gt;
      public partial class MainWindow : Window
      {
          public MainWindow()
          {
              InitializeComponent();
  
  
  
  
              var random = new Random();
  
              var iterations = 10000;
  
              var numberOfAnts = 10;
              var ants = CreateAntCollection(numberOfAnts);
  
              // time-loop
              for (var iteration = 0; iteration &lt; iterations; iteration++)
              {
  
                  // move ants
                  foreach (var ant in ants)
                  {
                      var x = (random.Next(3) - 1) + ant.Position.X;
                      var y = (random.Next(3) - 1) + ant.Position.Y;
  
                      ant.Move(x, y);
                  }
  
                  // animate the ant
                  // test - todo
                  Debug.WriteLine(ants[0].Position.X);
                  Canvas.SetLeft(ant1, ants[0].Position.X);   // movement not shown
              }
          }
  
          private static List&lt;Ant&gt; CreateAntCollection(int count)
          {
              var ants = new List&lt;Ant&gt;(count);
  
              for (var i = 0; i &lt; count; i++)
              {
                  var name = string.Format("ant-{0}", i);
  
                  var ant = new Ant(name);
  
                  ants.Add(ant);
              }
  
              return ants;
          }
  
      }
  
  
      class Ant
      {
          public Ant(string name)
          {
              Name = name;
              Position = new Position(80, 80);
          }
  
          public string Name { get; private set; }
  
          public Position Position { get; private set; }
  
          public void Move(int x, int y)
          {
              Position = new Position(x, y);
          }
  
          public override string ToString()
          {
              return Name;
          }
      }
  
  
      struct Position
      {
          public readonly int X;
  
          public readonly int Y;
  
          public Position(int x, int y)
          {
              X = x;
              Y = y;
          }
  
          public override string ToString()
          {
              return string.Format("{0},{1}", X, Y);
          }
      }
  }
  </code></pre>
  
  <p>This "solution" doesn't work: <code>element.InvalidateVisual();</code></p>