AvalonDock:如何使用 ILayoutUpdateStrategy 将文档与另一个文档一起添加

AvalonDock: How can I add a document alongside another using ILayoutUpdateStrategy

我已经使用此处的示例实现了 ILayoutupdateStrategy,但到目前为止,每个新的 LayoutDocument 始终放置在同一个 LayoutDocumentPane 中。我想自动将新的 LayoutDocument 添加到现有文档旁边。

我已经尝试创建一个新的 LayoutDocumentPaneGroup 并移动现有的 LayoutDocumentPane,并将新内容添加到该新组中,但是当我随后尝试将该组添加到布局结构中时,方法从未 return 和应用程序挂起。

LayoutDocumentPaneGroup newGroup = { a LayoutDocumentPaneGroup containing both the original sibling LayoutDocumentPane and the new content LayoutDocumentPane }
LayoutDocumentPaneGroup parent = { the parent group of the sibling document }

我试过类似的东西:

parent.RemoveChild(sibling);
parent.Children.Add( newGroup );

parent.Children.ReplaceChild( sibling, newGroup );

但他们似乎都依赖于这些方法。

我希望我完全以错误的方式处理这个问题,因此非常欢迎任何指点。

所以...事实证明,问题是您必须推迟将子项添加到正在添加的新文档组,直到 它被放入布局树中之后。

  1. 创建一个新的 LayoutDocumentPaneGroup 以包含现有的 LayoutDocumentPane 和新的 LayoutDocument
  2. 新建一个LayoutDocumentPane来封装LayoutDocument
  3. 获取对同级 LayoutDocumentPane 父级(应该是 LayoutDocumentPaneGroup)的引用
  4. 用新的 PaneGroup 替换兄弟 LayoutDocumentPane 将兄弟和新布局文档添加到新组

示例代码

    private void DockDocumentToBottom( LayoutDocumentPane sibling, LayoutDocument tobeDocked )
    {
        LayoutDocumentPaneGroup newGroup = new LayoutDocumentPaneGroup();
        newGroup.Orientation = System.Windows.Controls.Orientation.Vertical;
        LayoutDocumentPane newDocPane = new LayoutDocumentPane(tobeDocked);

        LayoutDocumentPaneGroup siblingParent = sibling.Parent as LayoutDocumentPaneGroup;
        if (siblingParent != null )
        {
            siblingParent.ReplaceChild(sibling, newGroup);
            newGroup.Children.Add(sibling);
            newGroup.Children.Add(newDocPane);
        }
        else
        {
            Debug.WriteLine("LayoutInitialiser: Failed to attach to a document pane group!");
        }
    }

我希望这对其他人有帮助!