/// <summary> /// Adds the message. /// </summary> /// <param name="edge">The edge.</param> /// <param name="message">The message.</param> private void AddMessage(NetSimConnection edge, ConnectionFrameMessage message) { INetSimVisualizableItem receiver; INetSimVisualizableItem sender; // get message receiver and sender GetMessageReceiverSender(edge, message, out receiver, out sender); var uimessage = new MessageControl(message.ShortName) { Width = 19, Height = 19, Tag = edge, MessagePath = { Tag = edge } }; // set message to sender location int top = sender.Location.Top; int left = sender.Location.Left; if (this.IsMessageSendingAnimationDone(message.Id)) { // calculate middle between A and B top = (edge.EndPointA.Location.Top + edge.EndPointB.Location.Top) / 2; left = (edge.EndPointA.Location.Left + edge.EndPointB.Location.Left) / 2; } // add meesage to this position Canvas.SetLeft(uimessage, left); Canvas.SetTop(uimessage, top); this.drawCanvas.Children.Add(uimessage); Storyboard storyBoard = null; if (message.TransmissionStep == NetSimMessageTransmissionStep.Sending) { if (!this.IsMessageSendingAnimationDone(message.Id)) { storyBoard = CreateMessageAnimation(edge, message, uimessage, NetSimMessageTransmissionStep.Sending); // messageStates[message.Id] = NetSimMessageTransmissionStep.Sending; } } else { if (!this.IsMessageReceivingAnimationDone(message.Id)) { storyBoard = CreateMessageAnimation( edge, message, uimessage, NetSimMessageTransmissionStep.Receiving); // messageStates[message.Id] = NetSimMessageTransmissionStep.Receiving; } } if (storyBoard == null) { return; } // when the animation has finished - mark animation as done // note: animation gets created multiple times - but only at last "redraw" // it has time to finish storyBoard.Completed += (s, e) => { this.messageStates[message.Id] = message.TransmissionStep; }; uimessage.BeginStoryboard(storyBoard); // start the animation storyBoard.Begin(); }