Реализация многодоковой оконной системы (например, blend, visual studio) в WPF

Как вы собираетесь реализовать оконную систему панели инструментов для закрепления, как показано в Expression Blend, где вы можете закреплять окна панели инструментов множеством способов друг над другом, перекрывая друг друга как вкладки или как плавающие окна верхнего уровня. Моя система должна вести себя примерно так же, как в Expression Blend. Также способ, которым я получаю визуальные подсказки, где окно панели инструментов пристыковывается при перетаскивании, это именно то, что мне нужно.

Есть только одно исключение: в режиме наложения при перетаскивании на окно панели инструментов, которое уже является верхним уровнем (оторвано), я могу прикрепить его только как вкладку, заполняющую все окно. Однако мне нужна система, в которой нет разницы между окном панели инструментов и основным окном. Мне нужно иметь возможность закрепить окна друг под другом в окне панели инструментов так же, как в главном окне.

Также обратите внимание, что из-за внутренней политики я не могу использовать для этого какую-либо библиотеку с открытым исходным кодом или стороннюю библиотеку.

Мне было бы интересно, как бы вы настроили общий дизайн класса для чего-то подобного? Я хотел бы остаться настолько общим, насколько это возможно, чтобы его можно было использовать для множества различных сценариев.

Поведение пристыковки такое же, как на следующем рисунке. В центре изображения показана область стыковки с перетаскиванием. И внешние изображения, где окно будет привязываться:

альтернативный текст http://img196.imageshack.us/img196/2450/dockingregions.png

Обычно я сталкиваюсь с мэрами: как мне спроектировать программную модель (как сохранить конфигурации стыковки в XAML) и как мне реализовать основные функциональные возможности. Первым делом я хотел бы иметь симбиоз DockPanel и TabControl. Что-то вроде этого:

<DockTabControl>
  <DockTabItem Dock="FirstLeft">
    <DockTabItem.Header>
        <TextBlock>Tab 1</TextBlock>
    </DockTabItem.Header>
    <!-- Tab 1 content -->
  </DockTabItem>
  <DockTabItem Header="Tab 2" Dock="SecondLeft" DockMode="MergeWithPreviousToTabgroup">
    <!-- Tab 2 content -->
  </DockTabItem>
  <DockTabItem Header="Tab 3" Dock="FirstMiddle">
    <!-- Tab 3 content -->
  </DockTabItem>
</DockTabControl>

Конечно, это пока не имеет смысла. Стыковка не может быть определена таким образом, и проблема окон еще не решена здесь. Но мне нравится идея определения закрепления и групп вкладок, просто определяя некоторые свойства в DockTabItem. Я действительно не хотел бы вводить дополнительные элементы управления, такие как TabGroups или подобные. Мне нравится поведение стыковки в DockPanel, просто определяя порядок дочерних элементов и присоединяемое свойство Dock. Конечно, моя стыковка будет немного более сложной и будет вести себя как то, что делает Grid.

Ответы на вопрос(4)

Ваш ответ на вопрос