Implementando um sistema de janelas multidock (como blend, visual studio) no WPF

Como você implementaria um sistema de janelas da caixa de ferramentas de acoplamento, como visto no Expression Blend, em que você pode encaixar as janelas da caixa de ferramentas de várias maneiras diferentes, superpondo-as como guias ou como janelas flutuantes de nível superior. Meu sistema deve se comportar da mesma forma que no Expression Blend. Além disso, a maneira como recebo pistas visuais onde a janela da caixa de ferramentas se encaixava ao arrastar é exatamente o que eu preciso.

Há apenas uma exceção: mesclada ao arrastar para uma janela da caixa de ferramentas que já está no nível superior (arrancada), só posso encaixá-la como uma guia que preenche toda a janela. No entanto, preciso de um sistema em que não haja diferença entre uma janela da caixa de ferramentas e a janela principal. Eu preciso ser capaz de encaixar as janelas embaixo umas das outras em uma janela da caixa de ferramentas, assim como na janela principal.

Observe também que, devido a uma política interna, não posso usar nenhuma fonte aberta ou biblioteca de terceiros para isso.

Eu estaria interessado em como você configuraria o design da classe geral para algo assim? Gostaria de permanecer o mais genérico possível, para que possa ser usado em muitos cenários diferentes.

O comportamento de ancoragem é como na figura a seguir. A imagem central mostra a região de acoplamento por arrasto sensível. E as imagens externas em que a janela se fechava:

texto alternativo http://img196.imageshack.us/img196/2450/dockingregions.png

Geralmente, estou enfrentando problemas de prefeito aqui: como faço para projetar o modelo de programação (como as configurações de encaixe devem ser mantidas no XAML) e como implementei de maneira aguda a funcionalidade subjacente. Meu primeiro pensamento foi que eu gostaria de ter uma simbiose de um DockPanel e um TabControl. Algo nas linhas disso:

<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>

Claro que isso ainda não faz sentido. O encaixe não pode ser definido dessa maneira e o problema da janela ainda não foi abordado aqui. Mas eu gosto da ideia de definir a docking e os tabgroups apenas definindo algumas propriedades no DockTabItem. Eu realmente não gostaria de introduzir controles extras, como TabGroups ou similares. Gosto de como o comportamento de encaixe no DockPanel apenas define a ordem dos filhos e a propriedade anexada do Dock. É claro que meu encaixe será um pouco mais complexo e se comportará mais como o Grid faz.

questionAnswers(4)

yourAnswerToTheQuestion