我正在编写一个应用程序来听音乐和看视频。在应用程序中,我有这 2 个页面:1 个用于播放音频播放代理 (APA) - 页面 A,另一个用于播放视频(使用 MediaElement) - 页面 B。而 WP8 的 APA 存在错误(我已经在这里问过(我找到了一个解决方案 - 在 MediaElement 播放和关闭之前和之前停止 APA 两次)。
问题是,在 A 页面上,我每秒使用一次 DispatcherTimer 滴答来检查 APA 实例位置,当我离开此页面时,我有一个停止此 DispatcherTimer 的功能。
即便如此,如果我在页面 A 之间导航多次,然后导航到页面 B,1 秒后应用程序在if (BackgroundAudioPlayer.Instance.PlayerState == ...
. 这意味着 DispatcherTimer 仍然滴答作响 ??????? 我怎样才能强制停止这个:(
我在这里发布了与 DispatcherTimer 相关的所有代码:
public DetailSongPage()
{
InitializeComponent();
this.DataContext = App.Model;
BackgroundAudioPlayer.Instance.PlayStateChanged += APA_Instance_PlayStateChanged;
}
DispatcherTimer timer = null;
private void APA_Instance_PlayStateChanged(object sender, EventArgs e)
{
if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing)
{
UpdateTracking();
}
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing || BackgroundAudioPlayer.Instance.PlayerState == PlayState.Paused)
{
UpdateTracking();
}
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
timer.Stop();
timer.Tick -= timer_Tick;
timer = null;
}
private void UpdateTracking()
{
sldTracking.Maximum = BackgroundAudioPlayer.Instance.Track.Duration.TotalMilliseconds;
tbMaxTime.Text = string.Format(@"{0:mm\:ss}",BackgroundAudioPlayer.Instance.Track.Duration);
// ^ these 2 lines update the UI for the slider and textblock
if (timer == null)
{
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
timer.Tick += timer_Tick;
timer.Start();
}
}
private void timer_Tick(object sender, EventArgs e)
{
if (this.timer != null)
{
try
{
if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing || BackgroundAudioPlayer.Instance.PlayerState == PlayState.Paused)
{
sldTracking.Value = BackgroundAudioPlayer.Instance.Position.TotalMilliseconds;
tbCurrentTime.Text = string.Format(@"{0:mm\:ss}", BackgroundAudioPlayer.Instance.Position);
}
}
catch
{
return;
}
}
}