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

时间:2018-03-04 13:08:55

标签: wpf avalondock

我已经使用示例实现了ILayoutupdateStrategy,但到目前为止,每个新的LayoutDocument始终放在同一个LayoutDocumentPane中。我想自动添加新的LayoutDocument和现有的Document。

我尝试创建一个新的LayoutDocumentPaneGroup并将现有的LayoutDocumentPane和新内容移动到该新组中,但是当我尝试将该组添加到布局结构中时,方法永远不会返回并且应用程序挂起。

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 个答案:

答案 0 :(得分:0)

所以......事实证明问题在于你必须将子项添加到正在添加的新文档组中,直到放入布局树后。

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

        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!");
            }
        }
    

    我希望这有助于其他人!