在WPF中实现multidock窗口系统(如blend,visual studio)

bit*_*onk 10 windows wpf docking

您将如何实现如Expression Blend中所示的对接工具箱窗口系统,您可以通过多种方式将工具箱窗口对接在一起,重叠为标签或浮动顶层窗口.我的系统应该与Expression Blend中的行为非常相似.此外,我得到视觉提示的方式,拖动时工具箱窗口将停靠,这正是我需要的.

只有一个例外:在混合时,当拖动到已经顶层(撕下)的工具箱窗口时,我只能将其作为填充整个窗口的选项卡停靠.但是我需要一个工具箱窗口和主窗口之间没有区别的系统.我需要能够将窗口停靠在工具箱窗口中,就像在主窗口中一样.

另请注意,由于内部策略,我无法使用任何开源或第三方库.

我会对你如何为这样的东西设置一般类设计感兴趣?我希望保持尽可能通用,以便它可以用于许多不同的场景.

停靠行为如下图所示.中心图像显示了感应拖曳对接区域.窗口会突然出现的外部图像:

alt text 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>
Run Code Online (Sandbox Code Playgroud)

当然这还没有意义.无法以这种方式定义停靠,并且此处尚未解决窗口问题.但我喜欢仅通过在DockTabItem上定义一些属性来定义对接和tabgroups的想法.我真的不想引入像TabGroups或类似的额外控件.我只是通过定义子节点和Dock附加属性的顺序来了解DockPanel中的对接行为.当然,我的对接会更复杂,行为更像网格.

Ray*_*rns 15

为了支持您在问题中说明的场景,单个DockPanel就足够了,因此您需要编写的只是OnDragEnter,OnDragOver,OnDragLeave和OnDragDrop的处理程序.我通常使用单个事件处理程序,因为这四个事件的处理非常相似:

OnDragEnter和OnDragOver:

  1. 计算哪个边缘以及DockPanel中哪个位置将被删除
  2. 删除所有现有的装饰工具
  3. 添加矩形装饰器以显示放置位置

OnDragLeave:

  1. 删除所有现有的装饰工具

OnDragDrop:

  1. 删除所有现有的装饰工具
  2. 计算哪个边缘以及DockPanel中哪个位置将被删除
  3. 从当前面板中删除拖动的项目,在其上设置DockPanel.Dock,并将其添加到新面板

当然,您还必须处理标题栏上的拖动并在源对象上调用DoDragDrop.

这里的两个复杂性是:

  • 确定DockPanel是否足以满足您的需求,或者您是否需要更复杂的数据结构
  • 确保几何计算考虑到窗口的所有可能配置

对于一个简单的算法,我估计需要一个星期才能解决所有皱纹问题.如果您需要一个非常复杂的数据结构,并且结构本身并不明显,那么可能需要花费大量时间来确定该部分.

  • 我不喜欢看到这个答案被低估,因为它确实描述了一些自建解决方案的开头部分(以及其他一些东西,比如'Adorner`s). (3认同)