您将如何实现一个停靠工具箱窗口系统,如在 Expression Blend 中所见,您可以通过多种方式将工具箱窗口停靠在彼此之间,重叠为选项卡或浮动顶层窗口。我的系统的行为应该与 Expression Blend 中的几乎相同。此外,我在拖动时获得工具箱窗口停靠的视觉提示的方式正是我所需要的。
只有一个例外:在混合中拖动到已经处于顶层(撕下)的工具箱窗口时,我只能将其停靠为填充整个窗口的选项卡。然而,我需要一个工具箱窗口和主窗口之间没有区别的系统。我需要能够将窗口停靠在工具箱窗口中,就像在主窗口中一样。
另请注意,由于内部政策,我不能为此使用任何开源或第 3 方库。
我很想知道你将如何为这样的事情设置通用类设计?我想尽可能保持通用性,以便它可以用于许多不同的场景。
对接行为如下图所示。中心图像显示了感知拖动停靠区域。以及窗口会捕捉到的外部图像:
替代文字 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 所做的。