uwp закрыть вторичный вид полностью


Я использую вторичный вид для запуска моих медиафайлов, но когда я закрываю свой вторичный вид с помощью кнопки закрыть на нем ( в то время как медиа все еще играет ) вторичный вид/окно закрывается, но медиа каким-то образом продолжает играть, потому что я слышу звук и источник звука, кажется, является основным видом ( главное окно приложения ). как я могу полностью закрыть вторичное окно, когда я его закрываю?

Вот мой код для создания вторичного представления.

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.Текущий.Close () в случае released.

Тогда он дает исключение, когда он пытается " окно.Текущий.Close () " С в выпущенном событии. согласно документации, исключение возникает из-за каких-либо текущих изменений ( которые могут быть вызваны воспроизведением медиа-файла ), но мне нужно принудительно закрыть окно, даже когда медиа-файл воспроизводится, как я могу это сделать? кстати, вот исключение:

Message = " COM-объект, который был отделен от его базового RCW, не может быть использован."

Обновление 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 , как показано в приведенном выше коде, и я также использую элементы управления транспортом по умолчанию, поэтому я не комментирую строки, используемые для назначения пользовательских элементов управления транспортом в приведенном выше коде, он работает нормально,но когда я затем пытаюсь закрыть окно, я получаю следующее исключение в приложении .i.g. cs файл, но stacktrace не существует:

Сообщение = " была предпринята попытка использовать COM-объект, не имеющий фабрики классов поддержки."Message =" COM-объект, который был отделен от его базового RCW, не может быть использован.

**Случай 3: * * точно так же, как Случай 2, но здесь я раскомментирую строки пользовательских элементов управления транспортом, поэтому теперь я назначаю пользовательские элементы управления транспортом своему элементу мультимедиа, на этот раз исключение немного отличается с некоторым stacktrace, а также

StackTrace = " в системе.Стабхелперс.Стабхелперс.GetCOMIPFromRCW_WinRT(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget)rn в Windows.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.код XAML.объект DependencyObject.get_Dispatcher ()rn в VLC.Метод MediaElement.d _ _ 160.MoveNext()rn - - - конец трассировки стека...

Message = " была предпринята попытка использовать COM-объект, не имеющий фабрики резервных классов."

1 2

1 ответ:

Короткий ответ: вам нужно убедиться, что ничто не удерживается на вашем экземпляре view, и вы вызываете Window.Закрыть консолидированное событие вида. Более длинный ответ с кодом находится здесь, в официальном образце. Взгляните на ViewLifetimeControl.исходный файл cs: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/MultipleViews/cs