XAML 如何在导航到另一帧后停止MediaPlayerElement播放音频?

zbwhf8kr  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(123)

MediaPlayerElement在导航到另一帧后正在播放音频。如果我再次导航到此帧,我可以听到两个音频示例,一个来自当前播放视频的音频,另一个来自上次导航到此帧时的音频。如何在导航到另一帧后停止MediaPlayerElement?

供参考:

框架的XAML部分的完整代码

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Styles/MediaPlayerDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Page.Resources>
<Grid Background="Transparent">
    <MediaPlayerElement  Name="YoutubePlayer" MaxWidth="640" MaxHeight="360" AreTransportControlsEnabled="True">
        <MediaPlayerElement.TransportControls>
            <video:CustomMediaTransportControls x:Name="CustomMediaControl" IsSkipBackwardButtonVisible="True" IsSkipForwardButtonVisible="True" IsSkipBackwardEnabled="True" IsSkipForwardEnabled="True" IsFullWindowButtonVisible="True" IsFullWindowEnabled="True" QualityChanged="CustomMediaControl_QualityChangedAsync"/>
        </MediaPlayerElement.TransportControls>
    </MediaPlayerElement>
</Grid>

框架的C#部分的完整代码

public sealed partial class VideosPage : Page
{

public VideosPage()
{
    this.InitializeComponent();
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    base.OnNavigatingFrom(e);
    YoutubePlayer.MediaPlayer.Dispose();
}

public async Task setVideoSourceAsync(YouTubeQuality videoQuality)
{

    try
    {
        var youtubeUrl = await YouTube.GetVideoUriAsync("QTYVJhy04rs", YouTubeQuality.Quality144P, videoQuality);
        YoutubePlayer.Source = MediaSource.CreateFromUri(youtubeUrl.Uri);
        YoutubePlayer.AutoPlay = true;
    }
    catch (Exception e)
    {
        //await setVideoSourceAsync();
    }
}

private async void Page_LoadedAsync(object sender, RoutedEventArgs e)
{
    if (ApplicationView.GetForCurrentView().IsViewModeSupported(ApplicationViewMode.CompactOverlay))
    {
        CustomMediaControl.IsCompactOverlayButtonVisible = true;
    }
    await setVideoSourceAsync(YouTubeQuality.Quality360P);
}

private async void CustomMediaControl_QualityChangedAsync(object sender, QualityChangedEventArgs e)
{
    await setVideoSourceAsync(e.NewQuality);
}
}
uelo1irk

uelo1irk1#

根据您希望在导航离开Page时发生的情况,您可以例如通过将此方法添加到MediaPlayer所在页面中的代码隐藏来处置MediaPlayer:

protected async override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{  
    base.OnNavigatingFrom(e);
    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
    {
        YoutubePlayer?.MediaPlayer.Dispose();
    });
}

您可能还想停止它并在导航回Page时继续,因此您可能应该重写void OnNavigatedTo(NavigationEventArgs e)方法。

mqkwyuun

mqkwyuun2#

我也遇到过这个问题。接受的答案会导致一个未处理的异常,即使有await。下面是这里提供的示例代码中的覆盖处理程序应该是什么样子。

protected async override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{  
    base.OnNavigatingFrom(e);
    YoutubePlayer.Source = null;
}

相关问题