UWP滑块滑动后

5 c# xaml slider uwp

我正在使用滑块来控制正在播放的 MediaElement 的位置。我已经实现了 ValueChanged 事件来同步滑块的位置和值。因此,当我拖动 Thumb 时,MediaElement 的位置也会发生变化。然而,这会造成糟糕的用户体验。理想的情况应该是这样的,用户完成滑动后,MediaElement 跳转到最终位置。所以我正在寻找像 AfterSliding 这样的事件/处理程序。

我见过使用 OnThumbDragCompleted 等解决方案。但是,这些问题是关于 WPF 的,我在 UWP 中找不到此类问题。有人有解决方法吗?

当前的:

    private void ProgressBar_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
    {
        MediaPlayer.Position = TimeSpan.FromSeconds(e.NewValue);
        LeftTimeTextBlock.Text = MusicDurationConverter.ToTime((int)e.NewValue);
    }
Run Code Online (Sandbox Code Playgroud)

预期的:

    private void ProgressBar_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
    {
        if (!isDragging || slidingFinished) MediaPlayer.Position = TimeSpan.FromSeconds(e.NewValue);
        LeftTimeTextBlock.Text = MusicDurationConverter.ToTime((int)e.NewValue);
    }
Run Code Online (Sandbox Code Playgroud)

- -更新 - -

我有一个每秒滴答一次的计时器,但是当我点击滑块(而不是拇指)区域时,点击的事件并不总是被触发,因此拇指会在点击的位置和新位置之间来回移动。我该如何解决这个问题,以便当用户仍然握住拇指时,它保持在单击的位置?我想点击的事件可能不是我应该使用的。

    public void Tick()
    {
        if (ShouldUpdate && !SliderClicked)
        {
            MediaSlider.Value = MediaControl.Player.PlaybackSession.Position.TotalSeconds;
        }
        SliderClicked = false;
    }

    private void MediaSlider_Tapped(object sender, TappedRoutedEventArgs e)
    {
        Debug.WriteLine("Tapped");
        MediaControl.SetPosition(MediaSlider.Value);
        SliderClicked = true;
    }

    private void MediaSlider_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
    {
        MediaControl.SetPosition(MediaSlider.Value);
        ShouldUpdate = true;
        Debug.WriteLine("Completed");
    }

    private void MediaSlider_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
    {
        ShouldUpdate = false;
        Debug.WriteLine("Started");
    }
Run Code Online (Sandbox Code Playgroud)

Fay*_*SFT 4

Slider 有ManipulationCompleted事件。当对 UIElement 的操作完成时发生。您可以订阅它来监听 Slider 是否完成。同时,如果要处理操作,需要将ManipulationMode设置为 System 或 None 以外的值事件。

\n\n

在 XAML 中:

\n\n
<Slider Name="timelineSlider" ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ValueChanged="SeekToMediaPosition" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 C# 中:

\n\n
private void Slider_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)\n        {\xe2\x80\x8b\n            Slider MySlider = sender as Slider;\xe2\x80\x8b\n            myMediaElement.Position = TimeSpan.FromSeconds(MySlider.Value);\xe2\x80\x8b\n            LeftTimeTextBlock.Text = MusicDurationConverter.ToTime((int)e.NewValue);\xe2\x80\x8b\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新:

\n\n

你可以订阅ValueChanged和ManipulationStarting事件。我发现当你拖动Thumb时,它会先触发starting事件然后valuechanged。如果你只点击,它会先触发valuechange然后starting事件。

\n\n

在 XAML 中:

\n\n
<Slider Name="timelineSlider" ManipulationStarting="TimelineSlider_ManipulationStarting"  ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ValueChanged="SeekToMediaPosition" Width="70"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 C# 中:

\n\n

您可以声明一个oldValue属性来保存Slider的值。当触发开始事件时,您可以比较oldValue和当前值。如果相等,则拖动Thumb。

\n\n
private double oldValue;\n\nprivate void SeekToMediaPosition(object sender, RangeBaseValueChangedEventArgs e)\n        {\n            if (isTap==true)\n            {\n                ...//tap\n            }\n            else\n            {\n\n            }\n            oldValue = timelineSlider.Value;\n        }\nprivate void Slider_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)\n        {\n\n            Slider MySlider = sender as Slider;\n            double s = MySlider.Value;\n            isTap = true;\n        }\n\n        private void TimelineSlider_ManipulationStarting(object sender, ManipulationStartingRoutedEventArgs e)\n        {\n            if (oldValue == timelineSlider.Value) {\n                //tuozhuai\n                isTap = false;\n            }\n            else{\n                isTap = true;\n            }\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

  • 如果要判断点击事件,可以添加一个Tapped事件,如:&lt;Slider IsTapEnabled="True" Tapped="Slider_Tapped" ManipulationCompleted="Slider_ManipulationCompleted" .....&gt;。当点击时,就会触发该事件.您可以执行与ManipulationCompleted相同的操作。 (2认同)