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
метод, если это так.