C# winform, как заставить трекбар двигаться (увеличивать свое значение) вместе со звуковым файлом?

В моей форме у меня есть небольшой медиаплеер, он довольно простой, в нем есть основные функционалисты nest, previous, play, stop, увеличение громкости и трек-бар. Я смог найти песню, перетаскивая панель треков с помощью этого кода:: (Предполагая, что максимальное значение полосы треков - это общее количество секунд звукового файла)

private void SeekBar_Scroll(object sender, EventArgs e)
{
   Player.Position = TimeSpan.FromSeconds(SeekBar.Value);
} 

Но я не смог заставить планку двигаться вперед сама по себе, когда играет музыка... Мне пришла в голову эта идея:

скажем, у нас есть песня продолжительностью 90 секунд. теперь максимальное значение полосы трека равно 100, поэтому: 100 -> 90 1 -> X X = 0,9 с - это интервал между тиками бара и значением, на которое значение полосы трека должно увеличиваться в каждом тике. Вот мой код:

while (SeekBar.Value < 100)
{
  System.Windows.Duration duration = Player.NaturalDuration;
  SeekBar.Value += duration.TimeSpan.Seconds / 100;
  Thread.Sleep(duration.TimeSpan.Seconds * 10);
}

Теперь я думаю, что это должно быть запущено в отдельном потоке, верно? но проблема, когда я делаю это, я получаю раздражающее сообщение о том, что TrackBar используется в потоке, отличном от потока, в котором он был создан... как я могу обойти это?

Я хотел поместить этот код в оба MouseLeave а также MouseEnter события, но это бессмысленно, потому что это будет в той же теме, и приложение будет зависать..

Как я могу заставить бар двигаться самостоятельно?

2 ответа

Решение

Вы должны создать WinForms Timer с интервалом или 1000 миллисекунд, и обновите трекбар в его Tick событие.

Похоже, у вас самая сложная часть (сопоставление длины полосы прокрутки с длиной аудиофайла). В остальном все просто.

Вы можете решить это с Timer, Установите интервал в какое-то значение (например, 1000 мс или, возможно, 500 мс, а в Tick, обновить полосу прокрутки (вызов SeekBar_Scroll). Для точного интервала протестируйте и посмотрите, что выглядит наиболее естественно.

Цикл while, вероятно, съест ненужный процессор, не говоря уже о блокировке остальной части вашего приложения.

Чтобы обойти контроль обновления, вам нужно проверить этот вопрос SO. Вам нужно проверить control.InvokeRequired и установите его через Invoke метод, если это так.

Другие вопросы по тегам