I got enough feedback and suggestions that I figured it would be better just to put the code up on CodePlex rather than package zips on my blog :-). Here it is: FloatableWindow project. The latest build I have is up there which incorporates some feedback that I’ve received.
UPDATE: If you like this idea VOTE FOR IT in the Silverlight Toolkit!
Basically the ShowDialog() API operates the same way that ChildWindow.Show() does today. No changes there, popup is used. But when you just want some simple MDI type windows, use Show() which will not use Popup but rather add the elements as children to your root visual. Now the key here is defining that root. Before you show the window you’d want to do something like this:
1: FloatableWindow fw = new FloatableWindow();
2: fw.Width = 200;
3: fw.Height = 200;
4: fw.Title = "Foobar";
5: fw.ParentLayoutRoot = this.LayoutRoot;
6: fw.VerticalOffset = 200;
7: fw.HorizontalOffset = 100;
Notice line #5 where I specify a Panel element to add it to? That would be required. An ArgumentNullException is thrown if it is not provided.
Thanks for the great feedback and encouragement on this refactoring. I hope that putting it on CodePlex provides a better home for evolution and tracking issues (I know there is an animation issue now with non-modal).