C# AvalonDock DockingManager不加载布局

C# AvalonDock DockingManager不加载布局,c#,wpf,xml-serialization,avalondock,C#,Wpf,Xml Serialization,Avalondock,为了保存和加载我的布局,我按照说明进行操作,但它对我不起作用 我在主窗口中找到了这个XAML: 这些是按钮单击的事件处理程序: private void SaveButton_Click(object sender, RoutedEventArgs e) { XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(myDM); using (var writer = new StreamWriter("te

为了保存和加载我的布局,我按照说明进行操作,但它对我不起作用

我在
主窗口中找到了这个
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);
    }
}
显示窗口并单击“保存”后,“测试”文件的内容为:


问题来了-在我点击加载按钮后,文档和固定点消失了,我在窗口中看到的只有两个按钮和一个空白矩形,我的布局应该在那里。此时,当我单击“保存”按钮时,这是写入“测试”文件的内容:


我使用的是AvalonDock 2.0.1746.0。有人知道如何修复吗?

编辑: 我尝试了您的代码,并将其输出与我的代码进行了比较,发现您的序列化文件缺少您的
LayoutDocument
layoutTable
ContentId
属性。AvalonDock在内部使用此属性将现有的
DockingManager
面板与序列化版本进行匹配,如您所见,如果没有此属性,任何功能都无法正常工作

还有两种方法可用于设置
ContentId
属性,可以显式设置为特定AvalonDock面板的属性,也可以隐式设置面板直接子级的
Name
属性。这是您修订的主窗口XAML代码,使用了两种方法


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


为了将来参考如何调试这个问题,我确实使用了下面的回调来调试和检查反序列化过程返回的值,其中
e
参数包含
Model
属性中的AvalonDock面板的反序列化版本(在您的情况下,它最初为null),如果
ContentId
属性正确,则将在其
content
属性中包含您面板的内容(由于
模型的
ContentId
属性中的空值,这也是空值)

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

旧的: 我记得以前版本的AvalonDock也有类似的问题,但我认为对我来说修复它的是升级到最新版本(您已经有了),因为有一个内部部分没有正确反序列化

但是,要尝试查找反序列化过程中的问题,可以尝试在
LayoutSerializer
回调中放置断点。希望这将为您提供更多关于具体问题的信息

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

谢谢你的回答。你的意思是我必须获得AvalonDock源代码并调试它吗?谢谢你的回答。出现了一个优先级更高的问题,我一直在努力解决。当我有时间解决这个问题时,我会调查一下,可能会接受你的回答。谢谢你的意见。我接受你的回答。或者,我找到了另一种方法,使其按预期工作。它不设置内容的ContentId或名称。我只是在反序列化之前用空方法订阅LayoutSerializationCallback事件。很高兴知道有多种方法可以做到这一点,因为与.NET相关的大多数事情似乎都有。。。我试试看,听起来比较容易管理。谢谢。我认为你的方法更干净,因为另一种方法太粗糙了。无论如何,设置一些ContentID并不是一个很大的负担。