Как универсальное приложение Windows может иметь несколько независимых окон (например, приложение Microsoft "Фотографии" )?

Я знаю, как открыть дополнительные окна с помощью TryShowAsStandaloneAsync. Однако, если исходное окно закрыто - TryShowAsStandaloneAsync не удается (почему?). И я не знаю, как его "оживить" (исходное окно).

Но "Фотографии", похоже, отлично работают, как настольное приложение. Как оно это делает? (Я хотел бы подражать этому.) Можно открыть окно с изображением, открыть другое, закрыть первое и все еще иметь возможность открывать больше окон.

В любом случае все будет в порядке - запуск Windows без главного окна или какой-то способ возобновления главного окна после его закрытия (для того, чтобы это было новое окно, которое нужно открыть) или некоторые другим способом.

Ответ 1

Посмотрите пример Пример приложения MultipleViews. У этого приложения есть проблема, которую вы описываете.

Каждый созданный вами вид будет иметь собственный поток пользовательского интерфейса и, следовательно, диспетчер. Ключ к этому приложению состоит в том, что TryShowAsStandaloneAsync вызывается из диспетчера текущего активного окна.

В примере OnLaunched код ищет ссылку на текущий открытый вид, используя идентификатор вида из аргументов запуска. Затем он использует диспетчера, связанного с этим представлением, для вызова кода пользовательского интерфейса, используя Dispatcher.RunAsync, в этом потоке пользовательского интерфейса. Вы должны использовать этот поток открытого окна, чтобы вызвать TryShowAsStandaloneAsync, чтобы запустить новый основной вид. Затем вы можете вызвать Window.Activate с помощью нового диспетчера основного вида.

Ответ 2

Ответ на вопрос, почему TryShowAsStandaloneAsync завершается сбой после закрытия главного окна:

Я думаю, что TryShowAsStandaloneAsync пытается использовать основной вид в качестве представления привязки (т.е. окно для размещения нового окна относительно).

Как только вы закрываете главное окно TryShowAsStandaloneAsync сбой, потому что он не имеет привязки.

Обходным путем является указание anchorViewId открытого вида (одного из новых окон, которое вы открыли перед закрытием главного окна), с помощью перегрузки TryShowAsStandaloneAsync:

await ApplicationViewSwitcher.TryShowAsStandaloneAsync(
    viewIdToShow, // Id of a new view, or of your hidden main view
    ViewSizePreference.Default,
    anchorViewId, // Id of one of your visible windows
    ViewSizePreference.Default);

От этого ответа.

Ответ 3

Я не уверен, если вы используете Dispatcher.RunAsync для создания представления, то есть:

async private void Button_Click(object sender, RoutedEventArgs e)
 {
 CoreApplicationView newView = CoreApplication.CreateNewView();
 int newViewId = 0;

await newView.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
 {
 var frame = new Frame();
 frame.Navigate(typeof(MainPage), newViewId);
 Window.Current.Content = frame;

// In Windows 10 UWP we need to activate our view first.
 // Let do it now so that we can use TryShow...() and SwitchAsync().
 Window.Current.Activate();

newViewId = ApplicationView.GetForCurrentView().Id;
 });

 bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
 }

для получения дополнительной информации, пожалуйста, обратитесь к: https://daxsnippets.wordpress.com/2015/07/09/windows-10-create-views/