Установить положение видео с помощью полосы прокрутки с помощью WPF в C#
Пример
В этом примере используется ScrollBar для отображения позиции видео. Этот пример также позволяет вам установить положение видео, отрегулировав ScrollBar.
Вещи могут сбивать с толку в любое время, когда вы используете один и тот же элемент управления для отображения (показывающий положение видео) и управления (регулировка положения видео). В этом примере, когда программа обновляет позицию ScrollBar, чтобы показать прогресс, вы не хотите, чтобы ScrollBar думал, что пользователь изменил значение элемента управления, чтобы установить позицию. р>
Вам также нужно подумать о том, что вы хотите сделать ScrollBar, когда пользователь его настраивает. Например, предположим, что вы нажимаете и перетаскиваете палец ScrollBar, чтобы установить положение видео. Пока пользователь перетаскивает большой палец, вы хотите, чтобы видео продолжало работать? Если это так, вы хотите переместить палец ScrollBar, чтобы показать свою позицию? Это работает, но может быть довольно запутанным, потому что большой палец не останется под мышью, когда пользователь тащит его. (Вы можете попробовать это самостоятельно. Это работает, но раздражает.)
В этом примере я решил прекратить воспроизведение видео, когда пользователь настраивает положение ScrollBar. Это делает программу намного проще.
В следующем коде показан код XAML, который определяет ScrollBar.
Ключевыми изменениями этого кода являются обработчики событий для событий Scroll и PreviewMouseDown.
Событие PreviewMouseDown происходит, когда пользователь нажимает кнопку мыши на элементе управления. Вы можете подумать, что вместо этого вы должны поймать событие MouseDown, но это событие происходит после . У элемента управления есть возможность обработать событие мыши. Обычно элемент управления захватывает событие мыши, обрабатывает его, вызывает какое-то событие более высокого уровня, такое как Scroll, а затем отбрасывает событие мыши. Это означает, что исходное событие мыши никогда не поднимается до уровня, где ваш код может его поймать.
Это результат организации события барботирования и туннелирования WPF. Исходное событие мыши «пузырится» через иерархию управления. В какой-то момент элемент управления улавливает его, вызывает собственное событие и останавливает событие барботажа. Если это событие продолжилось, оно в конечном итоге «туннелировалось» обратно через иерархию управления.
В любом случае, этот пример захватывает событие PreviewMouseDown элемента управления, чтобы он мог поймать событие мыши вниз, прежде чем он начнет всплывать, и ScrollBar сможет его поймать. В следующем коде показан обработчик события PreviewMouseDown.
// Пауза перед перемещением полосы прокрутки. private void sbarPosition_PreviewMouseDown(object sender, MouseButtonEventArgs e) { minionPlayer.Pause(); EnableButtons(false); }
Этот код приостанавливает MediaElement, а затем вызывает EnabledButtons, чтобы включить и отключить соответствующие кнопки, если видео не воспроизводится.
В следующем коде показан ScrollBar элемент управления Scroll.
private void sbarPosition_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e) { TimeSpan timespan = TimeSpan.FromSeconds(sbarPosition.Value); minionPlayer.Position = timespan; ShowPosition(); }
Значение ScrollBar представляет собой количество секунд между 0 и длиной видео. Этот обработчик событий преобразует значение в TimeSpan и использует его для размещения MediaElement. Затем он вызывает ShowPosition для обновления текстового поля, которое показывает прошедшее количество секунд.