uwp完全关闭二级视图

时间:2017-06-07 18:12:27

标签: c# xaml uwp application-lifecycle multiple-views

我正在使用辅助视图来运行我的媒体文件,但是当我关闭我的辅助视图并关闭它时(媒体仍在播放),辅助视图/窗口关闭但媒体以某种方式继续播放,因为我可以听到声音和声源似乎是主要视图(主应用程序窗口)。当我关闭它时,如何完全终止辅助窗口?

这是我创建辅助视图的代码。

await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            var frame = new Frame();
            frame.MinHeight = 200;
            frame.MinWidth = 200;
            compactViewId = ApplicationView.GetForCurrentView().Id;
            frame.Navigate(typeof(CompactNowPlayingPage), caption);
            Window.Current.Content = frame;
            Window.Current.Activate();
            ApplicationView.GetForCurrentView().Title = Title;

        });
        bool viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(compactViewId, ApplicationViewMode.Default);

更新

经过一些调试后,我知道在辅助视图上按下的关闭按钮只隐藏视图但它继续在其线程上运行,我只想要关闭按钮完全关闭辅助视图,关闭其线程并销毁窗户作为一个整体。

更新2

我跟踪了Windows示例多个视图,并且能够完成所有步骤,代码运行正常,直到它在发布的事件中到达 Windows.Current.Close()

然后它在尝试" Window.Current.Close()"时给出异常。在已发布的活动中。根据文档异常发生由于任何正在进行的更改(可能是因为媒体文件播放),但我需要强制关闭窗口,即使媒体文件正在播放我该怎么办?顺便说一下这是例外:

消息="无法使用已与其基础RCW分离的COM对象。"

更新3

这是最新更新的,我现在没有关注官方样本,现在只是遵循更简单的方法。

  

打开辅助视图的代码

await Helpers.DeviceTypeHelper.CompactOpen(e.ClickedItem as Video, identifier); //where identified is just a string for some custom logic in the secondary view.

//following method is located in a helper class within the project
internal static async Task CompactOpen(Video PlayingVideo, string caption)
{
    ApplicationView newView = null;
    await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        var frame = new Frame();
        frame.Navigate(typeof(CompactNowPlayingPage),new object[] { PlayingVideo,caption});
        Window.Current.Content = frame;
        Window.Current.Activate();
        newView = ApplicationView.GetForCurrentView();
        newView.Title = PlayingVideo.MyVideoFile.DisplayName;
    });

    await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newView.Id);

}  
  

次要视图

public sealed partial class CompactNowPlayingPage : Page
{
    public CompactNowPlayingViewModel ViewModel { get; } = new CompactNowPlayingViewModel();
    private CustomMediaTransportControls controls;
    public CompactNowPlayingPage()
    {
        InitializeComponent();
        this.Loaded += MediaPage_Loaded;
        this.Unloaded += MediaPage_Unloaded;
        Microsoft.Toolkit.Uwp.UI.Extensions.ApplicationView.SetExtendViewIntoTitleBar(this, true);
        Microsoft.Toolkit.Uwp.UI.Extensions.TitleBar.SetButtonBackgroundColor(this, Colors.Transparent);
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        string chk = "";
        var paramm = e.Parameter as object[];
        NowPlayingVideo = paramm[0] as Video;
        var vis = Visibility.Collapsed;
        chk = paramm[1].ToString();
        switch (chk)
        {
            case "library":
                vis = Visibility.Visible;
                break;
            case "playlist":
                vis = Visibility.Visible;
                break;
            case "history":
                vis = Visibility.Collapsed;
                break;
            case "directplay":
                vis = Visibility.Collapsed;
                break;
            default:
                break;
        }
        controls = new CustomMediaTransportControls(NowPlayingVideo,vis);
        Media.TransportControls = controls;
        PlayVideo();
    }
    private Video NowPlayingVideo { get; set; }
    private void PlayVideo()
    {
        if (NowPlayingVideo != null)
        {
            string token = "";
            if (StorageApplicationPermissions.FutureAccessList.Entries.Count == 800)
            {
                var en = StorageApplicationPermissions.FutureAccessList.Entries;
                StorageApplicationPermissions.FutureAccessList.Remove(en.Last().Token);
            }
            token = StorageApplicationPermissions.FutureAccessList.Add(NowPlayingVideo.MyVideoFile);
            Media.Source = null;
            Media.Source = $"winrt://{token}";
            SetViews();
        }
    }

    private void SetViews()
    {
        NowPlayingVideo.Views++;
        Database.DbHelper.UpdateViews(NowPlayingVideo.MyVideoFile.Path);
    }
    private void MediaPage_Loaded(object sender, RoutedEventArgs e)
    {
        Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().Consolidated += MediaPage_Consolidated;
    }

    private void MediaPage_Unloaded(object sender, RoutedEventArgs e)
    {
        Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().Consolidated -= MediaPage_Consolidated;
    }

    private void MediaPage_Consolidated(Windows.UI.ViewManagement.ApplicationView sender, Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs args)
    {
        Window.Current.Close();
    }

}
  

辅助视图XAML

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <vlc:MediaElement AreTransportControlsEnabled="True"
                      Name="Media"                     
                      HardwareAcceleration="True"
                      AutoPlay="True">
    </vlc:MediaElement>
</Grid>
  

案例1:一切运行完美如果我将视频文件放在Assets文件夹中并将其作为媒体元素的来源并在辅助文件上评论整个 OnanvigatdTo 方法页。而且我也能成功地关闭窗户。   ...

     

案例2 但是当我尝试通过 NowPlayingVideo 对象设置媒体时,如上面的代码所示,我也使用默认的传输控件,所以我不# 39;在上面的代码中注释用于分配自定义传输控件的行,它运行正常但是当我尝试关闭窗口时,我在 App.igcs 文件中遇到异常,但是stacktrace没有&# 39; t存在:

消息=&#34;尝试使用没有支持类工厂的COM对象。&#34;消息=&#34;无法使用已与其基础RCW分离的COM对象。

  

**案例3:**完全像案例2,但在这里我取消注释自定义传输控件行,所以现在我将自定义传输控件分配给我的媒体元素,这次异常与某些堆栈跟踪有点不同

StackTrace =&#34; at System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRT(Object objSrc,IntPtr pCPCMD,IntPtr&amp; ppTarget)\ r \ n at Windows.UI.Xaml.DependencyObject.get_Dispatcher()\ r \ n at VLC.MediaElement.d__160.MoveNext()\ r \ n ---堆栈跟踪结束...

Message =&#34;尝试使用没有支持类工厂的COM对象。&#34;

1 个答案:

答案 0 :(得分:2)

简短的回答是:您需要确保nothings保留在您的视图实例上,并在视图的Consolidated事件中调用Window.Close。代码的答案越长,官方样本就在这里。查看ViewLifetimeControl.cs源文件:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/MultipleViews/cs