По сути, этого должно быть достаточно, чтобы уведомить Blazor
об обновлении пользовательского интерфейса в цикле:
StateHasChanged();
Но есть несколько вещей.Во-первых, метод SetPosition
не содержит ожиданий и будет выполняться синхронно.
Тогда Bounce
можно сделать асинхронным, вместо того, чтобы создавать новые задачи самостоятельно, если вы не хотите блокировать основной поток.
Также кажется GameHeight
как константа или статика в текущем состоянии View, и поэтому я бы напрямую ссылался на него в вызываемом методе, а не передавал его как параметр, но это просто личное мнение.
Другое дело,убедиться, что Bounce не вызывается несколько раз, пока он уже «подпрыгивает».
И я думаю, что логические катушки немного упростятся.
Вот мое предложение:
public async Task Bounce()
{
if(Bouncing) return;
Bouncing = true;
while(Ball.CurrentPosition.Y <= GameHeight)
{
Ball.CurrentPosition.Y++;
StateHasChanged();
await Task.Delay(500);
}
// in case View has been resized, make sure Ball is not out of boundaries
Ball.CurrentPosition.Y = GameHeight;
StateHasChanged();
Bouncing = false;
}