C # WPF MVVM Управление положением медиаплеера с помощью слайдера делает звук заикаться - PullRequest
0 голосов
/ 17 января 2019

Для начала, на данный момент, все остальное работает отлично. Итак, у меня есть проект, который включает в себя часть музыкального проигрывателя (медиаплеер). Положение визуализируется с помощью текста и с помощью ползунка, и в этом моя проблема. Когда я делаю ползунок «перетаскиваемым» (чтобы я мог установить положение, а не просто получить его), носитель (.mp3) начинает заикаться случайным образом. Вот часть кода:

public double ElapsedSeconds
    {
        get
        {
            return mediaPlayer.Position.TotalSeconds;
        }
        set
        {
            //mediaPlayer.Position = TimeSpan.FromSeconds(value);
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(ElapsedSeconds)));
        }
    }

private void Timer_Tick(object sender, EventArgs e)
    {
        ElapsedSeconds = mediaPlayer.Position.TotalSeconds;
        TextContent = String.Format("{0} - {1} - {2:mm\\:ss}/{3:mm\\:ss}", playedArtist, playedTitle, TimeSpan.FromSeconds(ElapsedSeconds), TimeSpan.FromSeconds(TotalSeconds));
    }

ElapsedSeconds привязывается к значению ползунка. Я могу перетащить ползунок (и создать проблему) только когда раскомментирую эту строку

А вот что я уже пробовал:
- Я использовал приватное поле для хранения данных
- Пытался использовать милисекунды и тики, но стало хуже
- Попытался изменить частоту тиков диспетчера (в настоящее время 100 мс), что обновляет текущее значение

Есть ли способ заставить заикание уйти? (и если да, что это)

p.s .: Если кому-то интересно, вот весь файл .cs: GitHub Link

1 Ответ

0 голосов
/ 30 января 2019

После почти двух недель не думая о проблеме, я нашел решение. Просто нужно условие, когда устанавливать Позицию (поэтому я изменил закомментированную строку на эти):

if (mediaPlayer.Position > TimeSpan.FromSeconds(value + 1) || mediaPlayer.Position < TimeSpan.FromSeconds(value - 1))  
            mediaPlayer.Position = TimeSpan.FromSeconds(value);

Несмотря на то, что для изменения требуется не менее 1 секунды, таким образом программа игнорирует откаты в миллисекундах, которые вызывают заикание, пока ползунок по-прежнему можно перетаскивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...