Johan спросил меня поддерживается ли MDI в Авалоне. Мы не планировали реализацию поддержки MDI в Авалоне версии 1, потому что MDI довольно легко реализовать средствами Windows Forms и Windows Forms interop. Я быстренько набросал небольшое демо, потратив слишком много времени чтобы в Авалоне картинка стала выглядеть более менее приемлемо, прежде чем я понял, что нет никакого способа выложить картинку в блог (гррр,гррр).
Первую вещь которую я закодил в Visual Studio, начал новый проект. Я создал простую Windows Form и задал значение IsMDIContainer = true. После я создал вторую Windows Form как дочернюю форму, и поместил в нее следующий код:
Form f = new ChildForm();
f.MdiParent = mainForm;
f.Visible = true;
И это хорошо, но Авалон -- используем ElementHost. Я набросал перелестное меню и панель инструментов (креативно назвав "AvalonToolbar"), потом добавил некоторое количество кода в конструктор главного окна, чтобы поместить тулбар внутрь ElementHost, и поместить ElementHost внутрь окна:
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);
Вполне возможно, лучше сделать root моего AvalonToolbar.xaml Panel вместо Page, который поможет сохранить p.Root/p.Child = null, но по некоторым причинам я проявил упрямство.
В итоге, я сделал несколько ElementHost в ChildForm, закрепляя разные блоки контекста Авалона внутри формы. И вуаля! MDI приложение в Авалоне с множеством тулбаров и дочерних окон. И все заняло минут пятнадцать, наибольшее время из этого ушло на изучение документации по свойству isMdiContainer (я не помню MdiParent, прошло пять лет с тех пор как я использовал WinForms).