Как Вы пошли бы собирающийся реализация прикрепляющаяся система управления окнами панели инструментов, как замечено в Смешении Выражения, где можно прикрепить окна панели инструментов большим количеством способов друг под другом, наложившись как вкладки или как пускающий в ход высокоуровневые окна. Моя система должна вести себя в значительной степени то же как в Смешении Выражения. Также способ, которым я получаю визуальные индикаторы, где окно панели инструментов прикрепилось бы, когда перетаскивание точно, в чем я нуждаюсь.
Существует всего один exeception: В смешении при перетаскивании на окно панели инструментов, которое уже является верхним уровнем (оторванным), я могу только прикрепить его как вкладку, заполняющую целое окно. Мне однако нужна система, где нет никакого различия между окном панели инструментов и главным окном. Я должен смочь прикрепить окна друг под другом в окне панели инструментов так же, как в главном окне.
Также обратите внимание, что из-за внутренней политики я не могу пользоваться никакой библиотекой или третьей стороны с открытым исходным кодом для этого.
Я интересовался бы тем, как Вы установите общий дизайн класса для чего-то вроде этого? Я хотел бы остаться максимально универсальным, таким образом, это может использоваться для партии различных сценариев.
dockeing поведение как в следующем изображении. Центральное изображение показывает чувствительный регион прикрепления перетаскивания. И внешние изображения, где окно привязалось бы:
сопроводительный текст http://img196.imageshack.us/img196/2450/dockingregions.png
Обычно я сталкиваюсь к проблемам мэра здесь: Как я разрабатываю модель программирования (как прикрепляющиеся конфигурации должны быть сохранены в XAML), и как я acutally реализую базовую функциональность. Мое первое жесткое было бы то, что я хотел бы к habe симбиоз DockPanel и TabControl. Что-то в строках этого:
Tab 1
Конечно, это еще не имеет смысла. Прикрепление не может быть определено, тот путь и проблема работы с окнами еще не адресованы здесь. Но мне нравится идея определить прикрепление и tabgroups только путем определения некоторых свойств на DockTabItem. Я действительно не хотел бы представлять дополнительные средства управления как TabGroups или подобный. Мне нравится, как прикрепляющееся поведение в DockPanel только путем определения порядка детей и Прикрепления присоединило свойство. Конечно, мое прикрепление будет немного более сложным и ведет себя больше как то, что делает Сетка.
Для поддержки сценариев, которые вы иллюстрируете в своем вопросе, достаточно одной DockPanel
, поэтому все, что вам нужно написать, это обработчики для OnDragEnter, OnDragOver, OnDragLeave и OnDragDrop. Я обычно использую один обработчик событий, потому что обработка этих четырех событий очень похожа:
OnDragEnter & OnDragOver:
OnDragLeave:
OnDragDrop:
Естественно, вы также должны обработать перетаскивание на строке заголовка и вызвать DoDragDrop на исходном объекте.
Здесь есть две сложности:
Для простого алгоритма, по моим оценкам, потребуется неделя, чтобы отгладить все морщинки. Если вам нужна действительно сложная структура данных, а сама структура неочевидна, то на эту часть может уйти серьезное время.
На codeproject.com есть отличная библиотека стыковки WPF, которая имеет нужную вам функциональность. Я ее использовал myslef один раз, и у меня все прошло довольно гладко.
Посмотрите здесь: http://www.codeproject.com/KB/WPF/WPFdockinglib.aspx
В WPF уже есть элементы управления, которые поддерживают стыковку (или этот эффект). Посмотрите книгу Адама Натана WPF Unleashed, он рассказывает об этом во второй части.