With Windows 8.1 appeared multitasking APIs allowing developers to use the Snap capabilities of Windows 8.0, expanded with Windows 8.1.
Since then, apps like Mail can open an embedded link by opening a second window. This multi windowing capability even made Apple jealous, and it is rumored to be available in iOS 9.

Multiple windows

Developers can also open a second window of the same app! This is really interesting as it allows, for example, to open a mail in a second window while having a primary window with all your unread mails.

Multiple instances of the same app

Apart from Microsoft apps, only a few apps are making use of those useful APIs, which is sad but understandable as the multi-windowing feature was designed primarily for tablets, which are definitely not selling like hotcakes.

With Windows 10, Microsoft introduced Tablet Mode (which I like to call Immersive Mode) and apps are in Fullscreen mode only when this mode is enabled. Otherwise, apps will launch in windows, just like it's been the case before I was even born. Windows is about windows again, rejoice!

Getting started: how to use multiple windows


Interestingly, the APIs are the same whether you're targetting Windows 8.1 or 10. The new version of Windows brings some new features, such as resizing your window.

Here's the code.

public static async Task CreateNewWindow()
{
var newCoreAppView = CoreApplication.CreateNewView();
var appView = ApplicationView.GetForCurrentView();
await newCoreAppView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, async () =>
{
var window = Window.Current;
var newAppView = ApplicationView.GetForCurrentView();

#if WINDOWS_UAP
newAppView.SetPreferredMinSize(new Windows.Foundation.Size(400, 300));
#endif
var frame = new Frame();
window.Content = frame;
frame.Navigate(typeof(MainPage));
window.Activate();

await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newAppView.Id, ViewSizePreference.UseMore, appView.Id, ViewSizePreference.Default);

#if WINDOWS_UAP
var success = newAppView.TryResizeView(new Windows.Foundation.Size(400, 400));
#endif
});
}

First, you need to create a new CoreApplication view, so you have a new Dispatcher (new UI Thread) for that new view. Then, get the instance of the current window in that new view, set its Content (a Frame which navigates here to MainPage), and finally activate and show it by sending its Id to

ApplicationViewSwitcher.TryShowAsStandaloneAsync()

Bonus


As you can see in the code, I take the benefits of some new Windows 10 APIs:

  • SetPreferredMinSize : Allows you to set the default minimum size of a window. If your secondary window is a widget, or a mini-player, this method is for you.
  • TryResizeView : Your UX scenario implies resizing the window for any reasons? Go for it.


Of course, using reflection you can use those in a W8.1 app running on a W10 machine.

Result


Windows 10 Apps Windows 10 apps can resize and have a minimum size

Windows 8.1 window size can't be set by the developer, while the user has a very limited control over the window's size Windows 8.1 window size can't be set by the developer, while the user has a very limited control over the window's size

Updated


It also works on Windows 10 Mobile!

GitHub


As usual, the samples are available here: https://github.com/ThomasNigro/Sample3-MultiWindowing

Please note: I'm thinking of having just one repo with all the code samples inside, rather than having one repo per blogpost. Any opinion?