Silverlight has become increasingly popular for applications that run both in-browser and on the desktop like Sky’s Go and Netflix. One of the key new features in Silverlight 5 is multiple window support for desktop applications (also known as Out-of-Browser (OOB) applications).
Why Multiple Windows?
Multiple windows are common in quite a few applications:
- graphics packages like GIMP
- video production software like Adobe Premiere
- music editing software like CakeWalk
- e-mail packages like Outlook
- the long tail of Line-of-Business (LOB)/Enterprise/Scientific applications
Multi-window apps let users optimize usage of screen real estate across multiple displays.
There are a number of scenarios where you might choose Silverlight over say WPF:
- you have an existing application written in Silverlight
- your application needs to run both in-browser and on the desktop
- installing the full .Net framework in your target environment is problematic
On the flip side, if you're developing a new application that must support multiple windows and that doesn’t need to run in the browser and you have full control over the target environment, then WPF is probably a good choice. WPF also provides better support for dragging and dropping between windows. Yet another choice might be to build your application to target both WPF and Silverlight.
Then to add some more factors to the equation, there’s the new Windows Runtime – WinRT:
There are a good number of articles already written on getting started with multiple windows in Silverlight. Simply pick your favourite evangelist:
Cutting to the chase:
Nearly a year ago Mike Taulty wrote:
As an aside, I’ve seen a number of scenarios in Silverlight where developers use Application.Current.RootVisual as a way of finding the root of the visual tree – this kind of code might need revisiting in a Silverlight application that has content in multiple windows because the RootVisual does not necessarily provide a “root” for content living in a separate window.
Q: So how do you find the RootVisual in a multi-window environment?
A: Call Window.GetWindow and then look at the Window.Content.
Q: How do you find the focused element in a multi-window environment?
A: Call FocusManager.GetFocusedElement with the answer from Window.GetWindow.
Q: How do I get Popups to appear in a secondary window?
A: Popups defined in a XAML view appear inside their parent control. If you are creating a Popup programmatically then you will need to call Popup.SetWindow.
Q: So far calling Window.GetWindow solves all, where are those inevitable niggling issues?
A: All over the shop:
- A lot of third party software (including Microsoft’s) is going to still assume there can be only one window via Application.Current.RootVisual.
- If your doing custom chrome (no borders) then maximize on secondary displays is broken.
- Don’t even think about trying to set the WindowStyle to BorderlessRoundCornersWindow if it isn’t the main window.
- Move controls between windows at your own risk. Certain controls like Tooltips currently cache the window they first appeared in. Moving controls that use tooltips to another window may prove fatal.
- Tooltips again, they are positioned based on the main window size rather than the window they are actually in.
Both the ChildWindow and ContextMenu controls fail in a multi-window environment
I’ve created an open source project on CodePlex where they can succeed:
At time of writing Telerik’s RadContextMenu, RadWindow & RadComboBox do not work in a multi-window environment.
Some of the issues are expected to be fixed in a mid-February release.
It’s clearly early days for Silverlight 5 multi-window support and it looks like third party vendors are still playing catch-up. That said, with the advent of SiIlverlight 5, and it’s support for multiple windows, the lines between desktop and browser application are blurred a little bit more.