MDI Windows
Johan asked me about MDI support in Avalon. We don't plan to have a native Avalon implementation of MDI in version 1, mainly because MDI is so easy to do using Windows Forms and Windows Forms interop. I whipped together a quick demo of this, spending far too much time getting the Avalon content to look pretty before I realized there's no good way to post a picture on this blog (grumble grumble)...
First thing I did was fire up Visual Studio & start a new project I can do next Avalon-WinForms in (see earlier posts). I created a simple WinForms Form and set IsMdiContainer = true. Then I created a second WinForms Form to be the child window, and put one inside the other using:
Form f = new ChildForm();
f.MdiParent = mainForm;
f.Visible = true;
So far, so good, but no Avalon -- so we bring in ElementHost. I whipped up a nifty Avalon menu & toolbar (called creatively "AvalonToolbar"), then added some code to my main window's constructor to put that Avalon toolbar inside and ElementHost, and put the ElementHost inside the window:
ElementHost host = new ElementHost();
host.Dock = DockStyle.Top;
host.Height = 71;
// somewhat boneheaded way of getting Avalon content
// into the ElementHost
Page1 p = new Page1();
FrameworkElement root = p.root;
p.Child = null;
host.AddChild(root);
mainForm.Controls.Add(host);
Probably would have been better to have the root of my AvalonToolbar.xaml be a Panel instead of a Page, which would have saved me the p.root/p.Child = null hassle, but for some reason I was feeling stubborn...
Finally, I did the same ElementHost thing with ChildForm, sticking a different block of Avalon content inside that Form. And voila! An MDI application with Avalon many/toolbar and child windows. Took me about fifteen minutes, the single greatest time sink was getting the documentation for the IsMdiContainer property (I didn't remember the MdiParent property, I guess it has been five years since I was on WinForms...).