private async Task <double> Animate(PersonViewModel person, IDisplayLane lane) { var totalTime = 0.0; var width = _canvas.ActualWidth; await Dispatcher.InvokeAsync(() => { NameScope.SetNameScope(this, new NameScope()); var storyboard = new Storyboard(); var displayElement = new DisplayElement(person, lane, width, Configuration, _debugMode); List <MyAnimation> animations = displayElement.CreateAnimations(); RegisterName(displayElement.Label.Name, displayElement.Label); RegisterName(displayElement.Border.Name, displayElement.Border); var e = new AnimationEventArgs { TagName = displayElement.Border.Uid }; storyboard.Completed += (sender, args) => StoryboardOnCompleted(e); foreach (var da in animations) { Storyboard.SetTargetName(da, da.TargetName); Storyboard.SetTargetProperty(da, da.PropertyPath); storyboard.Children.Add(da); } totalTime = displayElement.TotalTime; var xPosition = displayElement.XAxis; var yPosition = displayElement.YAxis; Canvas.SetLeft(displayElement.Border, xPosition); Canvas.SetTop(displayElement.Border, yPosition); _canvas.Children.Add(displayElement.Border); _canvas.UpdateLayout(); storyboard.Begin(this); }); person.NextDisplayTime = DateTime.Now.AddSeconds(totalTime); return(totalTime); }