绑定到一个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的值。位置,我的代码有什么问题?谢谢你的帮助。

绑定到一个BackgroundMediaPlayer属性

对于任何想要回答这个问题的人,我已经在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...");
}
相关文章: