绑定到一个BackgroundMediaPlayer属性
本文关键字:一个 BackgroundMediaPlayer 属性 绑定 | 更新日期: 2023-09-27 18:03:29
我正在做一个Windows Phone 8.1项目,它利用后台任务来播放音频,我想将一个UI元素绑定到BackgroundMediaPlayer的属性。当前(这是一个MediaPlayer类)
在我的Xaml代码中我有这个TextBlock元素
<TextBlock x:Name="CurrentTime" FontSize="12" HorizontalAlignment="left"
Text="{Binding Position, Converter={StaticResource TimeSpanConverter}}"
Style="{StaticResource ListViewItemSubheaderTextBlockStyle}"/>
下面是转换器类:
class TimeSpanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (!(value is TimeSpan))
{
return String.Empty;
}
return ((TimeSpan)value).ToString("mm':'ss");
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
在后面的代码中,我像这样设置了TextBlock的数据上下文:
MediaPlayer _mediaPlayer = BackgroundMediaPlayer.Current;
CurrentTime.DataContext = _mediaPlayer;
问题是,我在用户界面中的控件没有更新MediaPlayer的值。位置,我的代码有什么问题?谢谢你的帮助。
对于任何想要回答这个问题的人,我已经在MSDN论坛上问过了,并得到了这个答案:
不幸的是,这种行为是设计出来的。MediaPlayer不参与XAML可视化树。正因为如此,它不像MediaElement那样从"DependencyObject"派生。因此,您将无法绑定到"MediaPlayer"。(通常你不应该这样做,因为这会导致性能问题)。你需要设置一个定时定时器和轮询当前位置。
http://social.msdn.microsoft.com/forums/en us/6e87652e - 4823 - 4 - ef8 - 8205 - dc1202d130ba/binding - - - backgroundmediaplayer property?forum=wpdevelop
你可以试试这个方法。XAML
<TextBlock Name="tbPlayerPosition" />
<Slider Name="sdPlayer"
IsHitTestVisible="False" />
<TextBlock Name="tbRemainTime" />
CS public DispatcherTimer _myDispatcherTimer = new DispatcherTimer();//to update player position
void PlaySong(Song song){
sdPlayer.Minimum = 0;
sdPlayer.Maximum = song.Duration.Ticks;
sdPlayer.Value = MediaPlayer.PlayPosition.Ticks;
tbPlayerPosition.Text = (new DateTime(MediaPlayer.PlayPosition.Ticks)).ToString("mm:ss");
tbRemainTime.Text = (new DateTime(song.Duration.Ticks - MediaPlayer.PlayPosition.Ticks)).ToString("mm:ss");
MediaPlayer.Play(song);
StartTimer();
}
public void StartTimer(){
_myDispatcherTimer.Start();
_myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
_myDispatcherTimer.Tick += OnTick;
}
public void OnTick(object o, EventArgs sender){
Deployment.Current.Dispatcher.BeginInvoke(() => {
if (MediaPlayer.State != MediaState.Playing){
_myDispatcherTimer.Stop();
_myDispatcherTimer.Tick -= OnTick;
return;
}
sdPlayer.Value = MediaPlayer.PlayPosition.Ticks;
tbPlayerPosition.Text = (new DateTime(MediaPlayer.PlayPosition.Ticks)).ToString("mm:ss");
tbRemainTime.Text = (new DateTime(MediaPlayer.Queue.ActiveSong.Duration.Ticks - MediaPlayer.PlayPosition.Ticks)).ToString("mm:ss");
});
System.Diagnostics.Debug.WriteLine("UpdateTimer...");
}