Щелчок мыши на WPF (Time) Slider не действует, когда большой палец слайдера движется привязанным к таймеру - PullRequest
0 голосов
/ 08 ноября 2018

Я использую MediaElement и (Time) Slider для воспроизведения и управления воспроизведением видео. Я использовал ответ 2 на этот вопрос в качестве основы.

В дополнение к возможности перетаскивания я бы также хотел, чтобы большой палец ползунка перемещался в точку щелчка мышью. Это работает нормально, когда MediaElement и (Time) Slider приостановлены, но при воспроизведении видео щелчок мыши не действует

Вот мой код

1010 * XAML *:

<MediaElement Source="..." 
              Name="mediaView"
              Height="450" LoadedBehavior="Manual" UnloadedBehavior="Stop" Stretch="UniformToFill" 
              MediaOpened="OnMediaOpened" MediaEnded="OnMediaEnded" MediaFailed="OnMediaFailed" Grid.Row="0" Grid.Column="0"/>
<Grid Name="mediaBar" VerticalAlignment="Bottom" Margin="5,10,5,0" Background="#B2282828"  Grid.Row="0" Grid.Column="0">
    <!-- ... -->
    <Slider Name="timeSlider" Margin="5,5,5,0" 
            Thumb.DragStarted="OnDragStarted" Thumb.DragCompleted="OnDragCompleted" ValueChanged="OnTimeSliderValueChanged" 
            PreviewMouseLeftButtonUp="OnMouseLeftButtonUp" IsMoveToPointEnabled="True"
            MinWidth="200" FlowDirection="LeftToRight"  
            Grid.Column="4" Cursor="ScrollWE" VerticalAlignment="Center"/>
    <!-- ... -->
</Grid>

соответствующая часть c # :

private void OnDragStarted(object sender, DragStartedEventArgs args)
{
    isDragging = true;
    ticks.Stop();
}
private void OnDragCompleted(object sender, DragCompletedEventArgs args)
{
    isDragging = false;
    int SliderValue = (int)timeSlider.Value;

    TimeSpan ts = new TimeSpan(0, 0, 0, 0, SliderValue);
    mediaView.Position = ts;
    if(currentStatus == Status.PLAYING)
        ticks.Start();
}
private void OnMouseLeftButtonUp(object sender, EventArgs ea)
{
    if(!isDragging)
    {
        mediaView.Pause();
        ticks.Stop();

        int SliderValue = (int)timeSlider.Value; // when video is playing this not the point of the mouse click

        // ...
    }
}

Я понимаю, что timeSlider.Value отображает текущую точку во времени вместо позиции щелчка мыши во время воспроизведения видео.

Есть ли другой способ измерить положение щелчка мышью и обновить значение ползунка этим?

Или лучшее решение для ситуации «щелчок мышью во время работы слайдера»?

1 Ответ

0 голосов
/ 10 ноября 2018

Попробуйте это:

private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs ea)
        {
            mediaView.Position = TimeSpan.FromSeconds((int)(mediaView.NaturalDuration.TimeSpan.TotalSeconds * (double)(ea.GetPosition(timeSlider).X / this.Width)));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...