根据 MediaPlaybackState 更改按钮中的图标
Changing the icon in a button based off of MediaPlaybackState
我有一个 MediaPlayerElement 和以下 class 来控制它:
class MediaPlayer : INotifyPropertyChanged
{
private MediaPlaybackState _State;
public MediaPlaybackState State
{
get
{
return _State;
}
set
{
_State = value;
OnPropertyChanged();
}
}
public BitmapImage AlbumArt;
public string Title;
public string Subtitle;
private MediaPlayerElement mediaPlayer;
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public void PlayerStateChanged(MediaPlaybackSession session, object sender)
{
State = session.PlaybackState;
}
public void SetMediaElement(MediaPlayerElement param)
{
mediaPlayer = param;
}
public void PlayFromSearchResult(SearchResult result)
{
AlbumArt = new BitmapImage();
AlbumArt.UriSource = new Uri(result.StationImage);
Title = result.StationName;
Subtitle = result.Subtext;
PlayFromRemoteM3U(result.StreamURL);
}
public void Pause()
{
mediaPlayer.MediaPlayer.Pause();
}
public void Play()
{
mediaPlayer.MediaPlayer.Play();
mediaPlayer.MediaPlayer.PlaybackSession.PlaybackStateChanged += PlayerStateChanged;
}
public async void PlayFromRemoteM3U(string url)
{
--SNIP--
mediaPlayer.Source = MediaSource.CreateFromUri(new Uri(streamDownloadUrl));
Play();
}
}
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
我想要一个 play/pause 按钮,它可以根据当前播放器状态更改其内容,我目前正在使用 TextBlock 进行调试以显示当前状态:
<TextBlock x:Name="media_player_state" x:FieldModifier="public" FontSize="20" Text="{x:Bind MediaPlayerInstance.State, Mode=OneWay}">Play</TextBlock>
当我 运行 应用程序并启动流以便状态发生变化时,我收到以下错误:
The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
我想知道我是否正在尝试以正确的方式完成此操作或如何解决此问题。
谢谢
因为您没有在每次播放() 或暂停() 时都设置状态。
更改 _State 值,然后使用 OnpropertyChanged("State")
因为你是从另一个线程调用它,所以你需要使用调度程序
public void PlayerStateChanged(MediaPlaybackSession session, object sender)
{
DispatcherHelper.ExecuteOnUIThreadAsync(() =>
{
State = session.PlaybackState;
});
}
请注意两件事:
1- DispatcherHelper 是 windows 社区工具包 nuget 包的一部分 (https://www.nuget.org/profiles/Microsoft.Toolkit)
2- DispatcherHelper 将被弃用,取而代之的是 7.0 版本中更好的 DispatcherQueueHelper
我有一个 MediaPlayerElement 和以下 class 来控制它:
class MediaPlayer : INotifyPropertyChanged
{
private MediaPlaybackState _State;
public MediaPlaybackState State
{
get
{
return _State;
}
set
{
_State = value;
OnPropertyChanged();
}
}
public BitmapImage AlbumArt;
public string Title;
public string Subtitle;
private MediaPlayerElement mediaPlayer;
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public void PlayerStateChanged(MediaPlaybackSession session, object sender)
{
State = session.PlaybackState;
}
public void SetMediaElement(MediaPlayerElement param)
{
mediaPlayer = param;
}
public void PlayFromSearchResult(SearchResult result)
{
AlbumArt = new BitmapImage();
AlbumArt.UriSource = new Uri(result.StationImage);
Title = result.StationName;
Subtitle = result.Subtext;
PlayFromRemoteM3U(result.StreamURL);
}
public void Pause()
{
mediaPlayer.MediaPlayer.Pause();
}
public void Play()
{
mediaPlayer.MediaPlayer.Play();
mediaPlayer.MediaPlayer.PlaybackSession.PlaybackStateChanged += PlayerStateChanged;
}
public async void PlayFromRemoteM3U(string url)
{
--SNIP--
mediaPlayer.Source = MediaSource.CreateFromUri(new Uri(streamDownloadUrl));
Play();
}
}
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
我想要一个 play/pause 按钮,它可以根据当前播放器状态更改其内容,我目前正在使用 TextBlock 进行调试以显示当前状态:
<TextBlock x:Name="media_player_state" x:FieldModifier="public" FontSize="20" Text="{x:Bind MediaPlayerInstance.State, Mode=OneWay}">Play</TextBlock>
当我 运行 应用程序并启动流以便状态发生变化时,我收到以下错误:
The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
我想知道我是否正在尝试以正确的方式完成此操作或如何解决此问题。
谢谢
因为您没有在每次播放() 或暂停() 时都设置状态。 更改 _State 值,然后使用 OnpropertyChanged("State")
因为你是从另一个线程调用它,所以你需要使用调度程序
public void PlayerStateChanged(MediaPlaybackSession session, object sender)
{
DispatcherHelper.ExecuteOnUIThreadAsync(() =>
{
State = session.PlaybackState;
});
}
请注意两件事:
1- DispatcherHelper 是 windows 社区工具包 nuget 包的一部分 (https://www.nuget.org/profiles/Microsoft.Toolkit)
2- DispatcherHelper 将被弃用,取而代之的是 7.0 版本中更好的 DispatcherQueueHelper