Похоже, вы пропустили _storyboard = new Storyboard()
, возможно, на вершине StartMarqueeing
метода.
Из того, что я вижу, видно, что каждый вызов StartMarqueeing добавляет дополнительную DoubleAnimation к раскадровке, а затем запускает ее снова. Таким образом, все старые DoubleAnimations будут воссозданы, и, похоже, они имеют приоритет.
Попробуйте каждый раз создавать новый объект Storyboard, а не просто повторно использовать его и добавлять в дочернюю коллекцию.
Обновление
О, теперь я вижу проблему. Вы не должны устанавливать оба параметра (Canvas.Left) и (Canvas.Right). Используйте только одно из двух: это все, что вам нужно в любом случае, и использование обоих даст Canvas противоречивые инструкции. Традиционно люди используют (Canvas.Left). Я думаю, что это то, что выбирает Canvas, и это вызывает асимметрию.
Вы можете удивиться, почему я говорю, что вы используете оба, когда вы не думаете, что ваши две анимации запускаются одновременно. На самом деле они делают: первая анимация запускается, затем сохраняет значение анимированного свойства, пока оно не будет удалено или удалено другой анимацией. Если вторая анимация затем запускается и изменяет другое свойство, она не затрагивает первую анимацию, поэтому значение первой анимации все еще присутствует.
Суть в том, что использование (Canvas.Left) на обеих анимациях должно исправить это, если вы используете по умолчанию HandoffBehavior.SnapshotAndReplace.