Реализовывая оконную систему мультиприкрепления (как смешение, Visual Studio) в WPF

Как Вы пошли бы собирающийся реализация прикрепляющаяся система управления окнами панели инструментов, как замечено в Смешении Выражения, где можно прикрепить окна панели инструментов большим количеством способов друг под другом, наложившись как вкладки или как пускающий в ход высокоуровневые окна. Моя система должна вести себя в значительной степени то же как в Смешении Выражения. Также способ, которым я получаю визуальные индикаторы, где окно панели инструментов прикрепилось бы, когда перетаскивание точно, в чем я нуждаюсь.

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

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

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

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

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

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


  
    
        Tab 1
    
    
  
  
    
  
  
    
  

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

10
задан Dave Clemmer 21 September 2011 в 02:33
поделиться

3 ответа

Для поддержки сценариев, которые вы иллюстрируете в своем вопросе, достаточно одной DockPanel, поэтому все, что вам нужно написать, это обработчики для OnDragEnter, OnDragOver, OnDragLeave и OnDragDrop. Я обычно использую один обработчик событий, потому что обработка этих четырех событий очень похожа:

OnDragEnter & OnDragOver:

  1. Вычислить, на какой край и в какое место DockPanel будет опущен элемент
  2. Удалить любой существующий адорнер
  3. Добавить прямоугольный адорнер, чтобы показать место падения

OnDragLeave:

  1. Удалить любой существующий адорнер

OnDragDrop:

  1. Удалить любой существующий адорнер
  2. Вычислите, на какой край и в какое место DockPanel будет опущен элемент
  3. Удалите перетащенный элемент из текущей панели, установите DockPanel. Dock на него, и добавить его в новую панель

Естественно, вы также должны обработать перетаскивание на строке заголовка и вызвать DoDragDrop на исходном объекте.

Здесь есть две сложности:

  • Решить, достаточно ли DockPanel для ваших нужд или вам понадобится более сложная структура данных
  • Убедиться, что геометрические расчеты учитывают все возможные конфигурации окон

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

15
ответ дан 3 December 2019 в 18:33
поделиться

На codeproject.com есть отличная библиотека стыковки WPF, которая имеет нужную вам функциональность. Я ее использовал myslef один раз, и у меня все прошло довольно гладко.

Посмотрите здесь: http://www.codeproject.com/KB/WPF/WPFdockinglib.aspx

4
ответ дан 3 December 2019 в 18:33
поделиться

В WPF уже есть элементы управления, которые поддерживают стыковку (или этот эффект). Посмотрите книгу Адама Натана WPF Unleashed, он рассказывает об этом во второй части.

-1
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: