我正在使用滑块来控制正在播放的 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)
Slider 有ManipulationCompleted事件。当对 UIElement 的操作完成时发生。您可以订阅它来监听 Slider 是否完成。同时,如果要处理操作,需要将ManipulationMode设置为 System 或 None 以外的值事件。
\n\n在 XAML 中:
\n\n<Slider Name="timelineSlider" ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ValueChanged="SeekToMediaPosition" />\nRun Code Online (Sandbox Code Playgroud)\n\n在 C# 中:
\n\nprivate 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 }\nRun 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"/>\nRun Code Online (Sandbox Code Playgroud)\n\n在 C# 中:
\n\n您可以声明一个oldValue属性来保存Slider的值。当触发开始事件时,您可以比较oldValue和当前值。如果相等,则拖动Thumb。
\n\nprivate 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 }\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2233 次 |
| 最近记录: |