AvalonDock DockingManager不加载布局

为了保存和加载我的布局,我遵循了这里的说明,但它对我不起作用。

我在MainWindow有这个XAML

  

这些是按钮点击的事件处理程序:

 private void SaveButton_Click(object sender, RoutedEventArgs e) { XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(myDM); using (var writer = new StreamWriter("test")) { layoutSerializer.Serialize(writer); } } private void LoadButton_Click(object sender, RoutedEventArgs e) { XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(myDM); using (var reader = new StreamReader("test")) { layoutSerializer.Deserialize(reader); } } 

显示窗口后,我点击保存“测试”文件的内容是:

                   

问题就出现了 – 在我单击加载按钮后,文档和可锚定消失,我在窗口中看到的只有2个按钮和一个空矩形,我的布局应该是。 此时,当我单击“保存”按钮时,这是写入“test”文件的内容:

                 

我正在使用AvalonDock 2.0.1746.0。 谁知道如何解决它?

编辑:

我尝试了你的代码,并将它的输出与我的相比较,发现你的序列化文件缺少LayoutDocumentLayoutAnchorableContentId属性。 此属性是AvalonDock在内部使用以将现有DockingManager面板与序列化版本匹配的属性,如果没有它,正如您所见,没有任何作用。

还有两种方法可用于设置ContentId属性,可以显式地作为特定AvalonDock面板的属性,也可以通过在面板的直接子项上设置Name属性来隐式设置。 这是您修改后的主窗口XAML代码,使用了两种方式。

                         

如果现在使用“保存”和“加载”按钮,您将看到现在在测试文件中设置了ContentId属性,如下所示。

                   

有关如何调试此问题的未来参考,我确实使用下面的回调来调试和检查反序列化过程返回的值,其中e参数包含Model属性中AvalonDock面板的反序列化版本(在你的情况下,原来是null),如果ContentId属性是正确的,将在其Content属性中包含面板的内容(由于ModelContentId属性中的null值,这也是null)。

回调处理程序中的s包含XmlLayoutSerializer引用,该引用还包含对DockingManager的引用,通过该引用可以检查其中包含的当前项。

旧:

我记得在早期版本的AvalonDock中遇到了类似的问题,但我认为为我修复它的是升级到最新版本(你已经拥有),因为内部部分没有正确反序列化。

但是,要尝试查找反序列化过程的问题,您可以尝试在LayoutSerializer回调中添加断点。 希望这能为您提供有关特定问题的更多信息。

 layoutSerializer.LayoutSerializationCallback += (s, e) => { object o = e.Content; };