Xamarin.Forms Slider.Clicked事件?

Xamarin.Forms Slider.Clicked事件?,xamarin.forms,Xamarin.forms,我正在用Xamarin.Forms制作一个mp3播放器,在这个播放器中,滑块应该显示过期的时间,并允许跳转到曲目中的位置。 据我所知,只有ValueChanged事件可用,不幸的是,每次计时器更新滑块值时,我也会触发player.SeekTo方法,导致播放中断 有没有办法专门在滑块上拾取触摸事件? 如果没有,是否有人对如何使这项工作有任何建议 如果相关,以下是我的主页代码: using System; using System.Collections.Generic; using System.

我正在用Xamarin.Forms制作一个mp3播放器,在这个播放器中,滑块应该显示过期的时间,并允许跳转到曲目中的位置。 据我所知,只有ValueChanged事件可用,不幸的是,每次计时器更新滑块值时,我也会触发player.SeekTo方法,导致播放中断

有没有办法专门在滑块上拾取触摸事件? 如果没有,是否有人对如何使这项工作有任何建议

如果相关,以下是我的主页代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace MuZor
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            PlayButton.Clicked += PlayButton_Clicked;
            PlaylistsButton.Clicked += PlaylistsButton_Clicked;
            RandomButton.Clicked += RandomButton_Clicked;
            RepeatButton.Clicked += RepeatButton_Clicked;
            ChoiceButton.Clicked += ChoiceButton_Clicked;
            PreviousButton.Clicked += PreviousButton_Clicked;
            NextButton.Clicked += NextButton_Clicked;
            TimeSlider.ValueChanged += TimeSlider_ValueChanged;

            MessagingCenter.Subscribe<Interfaces.IAudioPlayer>(App.player, "PlayerPrepared", (args) =>
            {
                System.Diagnostics.Debug.WriteLine("Message received");
                PlayerPrepared();
            });
        }

        private void TimeSlider_ValueChanged(object sender, ValueChangedEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("Slider value changed, value = " + e.NewValue + "(int = " + (int)e.NewValue);
            //App.player.SeekTo((int)e.NewValue);
        }

        private void NextButton_Clicked(object sender, EventArgs e)
        {
            if (!App.settings.RandomOn && App.settings.CurrentTrack < App.playlist.Count - 1)
            {
                Play((int)App.settings.CurrentTrack + 1);
            }
        }

        private void PreviousButton_Clicked(object sender, EventArgs e)
        {
            if (!App.settings.RandomOn && App.settings.CurrentTrack > 0)
            {
                Play((int)App.settings.CurrentTrack - 1);
            }
        }

        private void ChoiceButton_Clicked(object sender, EventArgs e)
        {
        }

        private void RepeatButton_Clicked(object sender, EventArgs e)
        {
        }

        private void RandomButton_Clicked(object sender, EventArgs e)
        {
        }

        private void PlaylistsButton_Clicked(object sender, EventArgs e)
        {
        }

        private void PlayButton_Clicked(object sender, EventArgs e)
        {
            if (App.settings.IsPaused || App.player.IsPlaying())
            {
                App.player.PauseResume();
                if (App.settings.IsPaused)
                {
                    UnPause();
                }
                else
                {
                    Pause();
                }
            }
            else
            {
                int trackToplay = App.settings.CurrentTrack != null ? (int)App.settings.CurrentTrack : 0;
                Play(trackToplay);
            }
        }

        private void Play(int currentTrack)
        {
            HelperClasses.SettingsHelper.SaveCurrentTrack(currentTrack);
            App.player.LoadAndPlay(App.playlist[currentTrack].Path);
        }

        private void Pause()
        {
            HelperClasses.SettingsHelper.SavePausedState(true);
            Device.BeginInvokeOnMainThread(() =>
            {
                PlayButton.Text = "Play";
            });
        }

        private void UnPause()
        {
            HelperClasses.SettingsHelper.SavePausedState(false);
            Device.BeginInvokeOnMainThread(() =>
            {
                PlayButton.Text = "Pause";
            });
            StartTimer();
        }

        private void StartTimer()
        {
            double position;
            Device.StartTimer(new TimeSpan(0, 0, 1), () =>
            {
                position = App.player.GetCurrentPosition();
                TimeSpan runTime = TimeSpan.FromMilliseconds(position);
                Device.BeginInvokeOnMainThread(() =>
                {
                    TimeLabel.Text = runTime.ToString(@"mm\:ss");
                    TimeSlider.Value = position;
                });
                if (App.player.IsPlaying())
                    return true;
                else
                    return false;
            });
        }

        private void PlayerPrepared()
        {
            var totalDurationInMS = App.player.GetDuration();
            TimeSlider.Maximum = totalDurationInMS;
            TimeSlider.Minimum = 0;
            TimeSpan totalDuration = TimeSpan.FromMilliseconds(totalDurationInMS);
            Device.BeginInvokeOnMainThread(() =>
            {
                RemainingTimeLabel.Text = totalDuration.ToString(@"mm\:ss");
                TimeLabel.Text = "00:00";
            });
            UnPause();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Xamarin.Forms;
名称空间MuZor
{
公共部分类主页:ContentPage
{
公共主页()
{
初始化组件();
PlayButton.Clicked+=PlayButton\u Clicked;
playlisbutton.Clicked+=playlisbutton_Clicked;
RandomButton.Clicked+=RandomButton\u Clicked;
RepeatButton.Clicked+=RepeatButton\u Clicked;
ChoiceButton.Clicked+=ChoiceButton\u Clicked;
PreviousButton.Clicked+=PreviousButton\u Clicked;
NextButton.Clicked+=NextButton\u Clicked;
TimeSlider.ValueChanged+=TimeSlider\u ValueChanged;
MessagingCenter.Subscribe(App.player,“PlayerPrepared”,(args)=>
{
System.Diagnostics.Debug.WriteLine(“收到消息”);
PlayerPrepared();
});
}
private void TimeSlider_ValueChanged(对象发送方,ValueChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine(“滑块值已更改,value=“+e.NewValue+”(int=“+(int)e.NewValue));
//App.player.SeekTo((int)e.NewValue);
}
已单击private void NextButton(对象发送者,事件参数e)
{
如果(!App.settings.RandomOn&&App.settings.CurrentTrack0)
{
播放((int)App.settings.CurrentTrack-1);
}
}
已单击私有无效选项按钮(对象发送者,事件参数e)
{
}
已单击私有无效重复按钮(对象发送者,事件参数e)
{
}
已单击私有无效随机按钮(对象发送者,事件参数e)
{
}
已单击私有无效播放列表按钮(对象发送者,事件参数e)
{
}
已单击私有void播放按钮(对象发送者,事件参数e)
{
如果(App.settings.IsPaused | | App.player.isplay())
{
App.player.PauseResume();
如果(App.settings.IsPaused)
{
取消暂停();
}
其他的
{
暂停();
}
}
其他的
{
int trackToplay=App.settings.CurrentTrack!=null?(int)App.settings.CurrentTrack:0;
播放(trackToplay);
}
}
私人无效播放(int currentTrack)
{
HelperClass.SettingsHelper.SaveCurrentTrack(currentTrack);
App.player.LoadAndPlay(App.playlist[currentTrack].Path);
}
私有无效暂停()
{
HelperClasses.SettingsHelper.SavePausedState(true);
Device.beginInvokeMainThread(()=>
{
PlayButton.Text=“播放”;
});
}
私有无效取消暂停()
{
HelperClasses.SettingsHelper.SavePausedState(false);
Device.beginInvokeMainThread(()=>
{
PlayButton.Text=“暂停”;
});
StartTimer();
}
私有void StartTimer()
{
双位;
Device.StartTimer(新的时间跨度(0,0,1),()=>
{
position=App.player.GetCurrentPosition();
TimeSpan运行时=TimeSpan.From毫秒(位置);
Device.beginInvokeMainThread(()=>
{
TimeLabel.Text=runTime.ToString(@“mm \:ss”);
时间滑块。值=位置;
});
if(App.player.IsPlaying())
返回true;
其他的
返回false;
});
}
私有void PlayerPrepared()
{
var totalDurationInMS=App.player.GetDuration();
时间滑块最大值=总持续时间Nms;
时间滑块。最小值=0;
TimeSpan totalDuration=TimeSpan.From毫秒(TotalDurationNms);
Device.beginInvokeMainThread(()=>
{
RemainingTimeLabel.Text=totalDuration.ToString(@“mm\:ss”);
TimeLabel.Text=“00:00”;
});
取消暂停();
}
}
}

我想我已经找到了一个解决方法。由于valuechanged事件同时包含旧值和新值,因此只有当差值为负值或大于2时,我才会触发SeekTo