UWP несколько просмотров не закрываются

ПРОБЛЕМА

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

ПЫТАЛСЯ

Я проследил за несколькими образцами окон и смог выполнить все шаги, скопировал файл ViewLifetimeControl.cs из образца и использовал его в своем проекте. код работает нормально, пока не достигнет Windows.Current.Close() в освобожденном событии вторичного представления.

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

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

Код для создания и отображения вторичного представления

internal static async Task CompactOpen(string Title, string caption)
{
    ViewLifetimeControl viewControl = null;
    await CoreApplication.CreateNewView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    { 
        viewControl = ViewLifetimeControl.CreateForCurrentView();
        viewControl.Title = Title;               
        viewControl.StartViewInUse();

        var frame = new Frame();
        frame.MinHeight = 200;
        frame.MinWidth = 200;
        frame.Navigate(typeof(CompactNowPlayingPage), new object[] { viewControl,caption});
        Window.Current.Content = frame;
        Window.Current.Activate();
        ApplicationView.GetForCurrentView().Title = viewControl.Title;
    });
    ((App)App.Current).SecondaryViews.Add(viewControl);

    var selectedView = viewControl;
    var sizePreference = new SizePreferenceString() { Title = "SizePreference", Preference = ViewSizePreference.Default };
    var anchorSizePreference = new SizePreferenceString() { Title = "AnchorSizePreference", Preference = ViewSizePreference.Default };
    if (selectedView != null && sizePreference != null && anchorSizePreference != null)
    {
        try
        {
            selectedView.StartViewInUse();

            var viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(
                selectedView.Id,
                sizePreference.Preference,
                ApplicationView.GetForCurrentView().Id,
                anchorSizePreference.Preference);

            if (!viewShown)
            {
                // The window wasn't actually shown, so release the reference to it
                // This may trigger the window to be destroyed
            }
            // Signal that switching has completed and let the view close
            selectedView.StopViewInUse();
        }
        catch (InvalidOperationException)
        {
            // The view could be in the process of closing, and
            // this thread just hasn't updated. As part of being closed,
            // this thread will be informed to clean up its list of
            // views (see SecondaryViewPage.xaml.cs)
        }
    }           

}

Выпущенное событие

private async void ViewLifetimeControl_Released(Object sender, EventArgs e)
{
    ((ViewLifetimeControl)sender).Released -= ViewLifetimeControl_Released;
    // The ViewLifetimeControl object is bound to UI elements on the main thread
    // So, the object must be removed from that thread
    await mainDispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        ((App)App.Current).SecondaryViews.Remove(thisViewControl);
    });

    // The released event is fired on the thread of the window
    // it pertains to.
    //
    // It's important to make sure no work is scheduled on this thread
    // after it starts to close (no data binding changes, no changes to
    // XAML, creating new objects in destructors, etc.) since
    // that will throw exceptions
    Window.Current.Close(); //this is where that exception occurs
}

Примечание: оба вышеупомянутых метода и даже все связанные переменные, все они, я следовал рекомендациям в образце uwp для нескольких представлений.

Спасибо заранее, любая помощь будет очень признательна, я только хочу принудительно закрыть вторичный вид (если это возможно)

1 ответ

Это в редакторе или в приложении? Если это в вашей отладке или сборке приложения, вторичное представление, скорее всего, все еще открыто, но скрыто. Вы можете использовать пользовательскую кнопку закрытия, которая не выполняет свою работу достаточно хорошо. Вместо того, чтобы подавлять SecondaryViews.Remove вы должны сделать то, что вы изначально написали и попробовать StopViewInUse, Это может не сработать, я не привык к такого рода вещам.

Другие вопросы по тегам