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。 谁知道如何解决它?
编辑:
我尝试了你的代码,并将它的输出与我的相比较,发现你的序列化文件缺少LayoutDocument
和LayoutAnchorable
的ContentId
属性。 此属性是AvalonDock在内部使用以将现有DockingManager
面板与序列化版本匹配的属性,如果没有它,正如您所见,没有任何作用。
还有两种方法可用于设置ContentId
属性,可以显式地作为特定AvalonDock面板的属性,也可以通过在面板的直接子项上设置Name
属性来隐式设置。 这是您修改后的主窗口XAML代码,使用了两种方式。
如果现在使用“保存”和“加载”按钮,您将看到现在在测试文件中设置了ContentId
属性,如下所示。
有关如何调试此问题的未来参考,我确实使用下面的回调来调试和检查反序列化过程返回的值,其中e
参数包含Model
属性中AvalonDock面板的反序列化版本(在你的情况下,原来是null),如果ContentId
属性是正确的,将在其Content
属性中包含面板的内容(由于Model
的ContentId
属性中的null值,这也是null)。
回调处理程序中的s
包含XmlLayoutSerializer
引用,该引用还包含对DockingManager
的引用,通过该引用可以检查其中包含的当前项。
旧:
我记得在早期版本的AvalonDock中遇到了类似的问题,但我认为为我修复它的是升级到最新版本(你已经拥有),因为内部部分没有正确反序列化。
但是,要尝试查找反序列化过程的问题,您可以尝试在LayoutSerializer
回调中添加断点。 希望这能为您提供有关特定问题的更多信息。
layoutSerializer.LayoutSerializationCallback += (s, e) => { object o = e.Content; };