Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 滑动后的UWP滑块_C#_Xaml_Uwp_Slider - Fatal编程技术网

C# 滑动后的UWP滑块

C# 滑动后的UWP滑块,c#,xaml,uwp,slider,C#,Xaml,Uwp,Slider,我使用滑块来控制播放媒体元素的位置。我已经实现了ValueChanged事件来同步滑块的位置和值。因此,当我拖动拇指时,MediaElement的位置也会改变。然而,这会造成糟糕的用户体验。理想的情况应该是,在用户完成滑动后,MediaElement跳到最终位置。因此,我正在寻找像后滑这样的事件/处理程序 我见过像使用Onthumbdragcomplete这样的解决方案。然而,这些问题是关于WPF的,我在UWP中找不到这样的问题。有人有解决办法吗 当前: private void Pro

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

我见过像使用Onthumbdragcomplete这样的解决方案。然而,这些问题是关于WPF的,我在UWP中找不到这样的问题。有人有解决办法吗

当前:

    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;
    }