C# 滑动后的UWP滑块
我使用滑块来控制播放媒体元素的位置。我已经实现了ValueChanged事件来同步滑块的位置和值。因此,当我拖动拇指时,MediaElement的位置也会改变。然而,这会造成糟糕的用户体验。理想的情况应该是,在用户完成滑动后,MediaElement跳到最终位置。因此,我正在寻找像后滑这样的事件/处理程序 我见过像使用Onthumbdragcomplete这样的解决方案。然而,这些问题是关于WPF的,我在UWP中找不到这样的问题。有人有解决办法吗 当前:C# 滑动后的UWP滑块,c#,xaml,uwp,slider,C#,Xaml,Uwp,Slider,我使用滑块来控制播放媒体元素的位置。我已经实现了ValueChanged事件来同步滑块的位置和值。因此,当我拖动拇指时,MediaElement的位置也会改变。然而,这会造成糟糕的用户体验。理想的情况应该是,在用户完成滑动后,MediaElement跳到最终位置。因此,我正在寻找像后滑这样的事件/处理程序 我见过像使用Onthumbdragcomplete这样的解决方案。然而,这些问题是关于WPF的,我在UWP中找不到这样的问题。有人有解决办法吗 当前: private void Pro
private void ProgressBar_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
MediaPlayer.Position = TimeSpan.FromSeconds(e.NewValue);
LeftTimeTextBlock.Text = MusicDurationConverter.ToTime((int)e.NewValue);
}
预期:
private void ProgressBar_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (!isDragging || slidingFinished) MediaPlayer.Position = TimeSpan.FromSeconds(e.NewValue);
LeftTimeTextBlock.Text = MusicDurationConverter.ToTime((int)e.NewValue);
}
---更新---
我有一个计时器,它每秒钟都在滴答作响,但是当我点击滑块(不是拇指)区域时,点击的事件并不总是被触发,因此拇指会在点击的位置和新位置之间来回移动。我如何解决它,以便当用户仍然握住拇指时,它保持在单击的位置?我想我不应该用抽头事件
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");
}
Slider具有OperationCompleted事件。在UIElement上的操作完成时发生。如果Slider已完成,您可以订阅它以侦听。同时,如果要处理操作事件,您需要将OperationMode设置为System以外的值或None 在XAML中:
<Slider Name="timelineSlider" ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ValueChanged="SeekToMediaPosition" />
<Slider Name="timelineSlider" ManipulationStarting="TimelineSlider_ManipulationStarting" ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ValueChanged="SeekToMediaPosition" Width="70"/>
更新:
您可以订阅ValueChanged和操纵开始事件。我发现当您拖动拇指时,它将首先触发开始事件,然后触发ValueChanged。如果您只单击,它将首先触发valuechange,然后触发开始事件
在XAML中:
<Slider Name="timelineSlider" ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ValueChanged="SeekToMediaPosition" />
<Slider Name="timelineSlider" ManipulationStarting="TimelineSlider_ManipulationStarting" ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ValueChanged="SeekToMediaPosition" Width="70"/>
没有什么比ValueChanged事件更有效的了。它只是工作得太好,被称为方式太频繁。在这些情况下,我有一个实用方法,它获取一个代码块,并在用户做出决定时运行它:
public static class Utility
{
private static DispatcherTimer settledTimer;
public delegate void SettledCallback( );
public static void RunWhenSettled(SettledCallback callback)
{
if (settledTimer == null)
{
settledTimer = new DispatcherTimer( );
settledTimer.Interval = TimeSpan.FromSeconds(.4);
settledTimer.Tick += delegate
{
settledTimer.Stop( );
callback( );
settledTimer = null;
};
settledTimer.Start( );
}
else if (settledTimer.IsEnabled)
settledTimer.Start( ); // resets the timer...
}
}
private void ProgressBar_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
Utility.RunWhenSettled(delegate
{
MediaPlayer.Position = TimeSpan.FromSeconds(e.NewValue);
LeftTimeTextBlock.Text = MusicDurationConverter.ToTime((int)e.NewValue);
});
}
为操作开始和操作完成添加事件处理程序。也不要忘记设置操作模式。例如,操纵模式=“全部”
请提供您的代码,以了解我们如何帮助解决您的问题problem@sayahimad我不知道该放什么代码,因为我只是在寻找一些事件,而不是调试我的模式。谢谢!那正是我要找的!我还有一个问题。如何判断触发的是拖动事件还是单击事件?click事件似乎没有触发
操纵完成
。如果您想判断一个click事件,您可以添加一个点击事件,如:。当您单击时,该事件将被触发。您可以执行与操纵完成相同的操作。很抱歉再次打扰您,但我有一些冲突不知道如何解决。你能看看更新区吗?我也发现了这个问题,我已经更新了答案,只是一个想法或建议
private bool dragStarted = false;
private void Slider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (!dragStarted)
{
// Do work
}
}
private void Slider_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
dragStarted = true;
}
private void Slider_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
// Do work
dragStarted = false;
}