11

您将如何实现一个停靠工具箱窗口系统,如在 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 所做的。

4

4 回答 4

19

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

OnDragEnter 和 OnDragOver:

  1. 计算 DockPanel 中的哪条边和哪个位置将被丢弃
  2. 删除任何现有的装饰器
  3. 添加矩形装饰器以显示放置位置

OnDragLeave:

  1. 删除任何现有的装饰器

OnDragDrop:

  1. 删除任何现有的装饰器
  2. 计算 DockPanel 中的哪条边和哪个位置将被丢弃
  3. 从当前面板中删除拖动的项目,在其上设置 DockPanel.Dock,并将其添加到新面板

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

这里的两个复杂性是:

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

对于一个简单的算法,我估计需要一周时间才能消除所有皱纹。如果您需要一个非常复杂的数据结构并且结构本身并不明显,则可能需要很长时间才能弄清楚这部分。

于 2010-02-12T23:07:20.253 回答
4

有人在 codeproject.com 上发布了一个很棒的 WPF 对接库,它具有您正在寻找的功能。我自己用过一次,我很顺利。

在这里查看:http: //www.codeproject.com/KB/WPF/WPFdockinglib.aspx

于 2010-02-13T22:28:19.110 回答
3

AvalonDock 很好。

https://github.com/Dirkster99/AvalonDock

很遗憾你不能使用它;)

于 2011-02-22T14:58:00.050 回答
-1

WPF 已经具有支持停靠(或那种效果)的控件。查看 Adam Nathan 的 WPF 书籍WPF Unleashed,他在第 2 部分中介绍了它。

于 2010-02-12T02:42:41.467 回答