cec*_*eco 6 c# wpf xml-serialization avalondock
为了保存和加载我的布局,我遵循了这里的说明,但它对我不起作用.
我在XAML里面有这个MainWindow:
<StackPanel Orientation="Vertical">
<Button Content="Save"
Click="SaveButton_Click"/>
<Button Content="Load"
Click="LoadButton_Click"/>
<ad:DockingManager x:Name="myDM">
<ad:LayoutRoot>
<ad:LayoutPanel>
<ad:LayoutDocumentPane>
<ad:LayoutDocument Title="Document">
<TextBox />
</ad:LayoutDocument>
</ad:LayoutDocumentPane>
</ad:LayoutPanel>
<ad:LayoutRoot.LeftSide>
<ad:LayoutAnchorSide>
<ad:LayoutAnchorGroup>
<ad:LayoutAnchorable Title="Left">
<TextBox/>
</ad:LayoutAnchorable>
</ad:LayoutAnchorGroup>
</ad:LayoutAnchorSide>
</ad:LayoutRoot.LeftSide>
</ad:LayoutRoot>
</ad:DockingManager>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
这些是按钮点击的事件处理程序:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
显示窗口后,我点击保存"测试"文件的内容是:
<?xml version="1.0" encoding="utf-8"?>
<LayoutRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<RootPanel Orientation="Horizontal">
<LayoutDocumentPane>
<LayoutDocument Title="Document" IsSelected="True" IsLastFocusedDocument="True" LastActivationTimeStamp="04/12/2013 14:50:38" />
</LayoutDocumentPane>
</RootPanel>
<TopSide />
<RightSide />
<LeftSide>
<LayoutAnchorGroup>
<LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="Left" />
</LayoutAnchorGroup>
</LeftSide>
<BottomSide />
<FloatingWindows />
<Hidden />
</LayoutRoot>
Run Code Online (Sandbox Code Playgroud)
问题就出现了 - 在我单击加载按钮后,文档和可锚定消失,我在窗口中看到的只有2个按钮和一个空矩形,我的布局应该是.此时,当我单击"保存"按钮时,这是写入"test"文件的内容:
<?xml version="1.0" encoding="utf-8"?>
<LayoutRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<RootPanel Orientation="Horizontal">
<LayoutDocumentPane />
</RootPanel>
<TopSide />
<RightSide />
<LeftSide>
<LayoutAnchorGroup Id="d3710e74-e6b5-4541-8b6f-554197c29dd6" />
</LeftSide>
<BottomSide />
<FloatingWindows />
<Hidden>
<LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="Left" IsSelected="True" LastActivationTimeStamp="04/12/2013 14:53:56" PreviousContainerId="d3710e74-e6b5-4541-8b6f-554197c29dd6" PreviousContainerIndex="0" />
</Hidden>
</LayoutRoot>
Run Code Online (Sandbox Code Playgroud)
我正在使用AvalonDock 2.0.1746.0.任何人都知道如何解决它?
小智 22
我尝试了你的代码,并将它的输出与我的输出进行比较,发现你的序列化文件缺少ContentId你LayoutDocument和你的属性LayoutAnchorable.此属性是AvalonDock在内部使用以将现有DockingManager面板与序列化版本匹配的属性,如果没有它,正如您所见,没有任何作用.
还有两种方法可用于设置ContentId属性,可以显式地作为特定AvalonDock面板的属性,也可以通过Name在面板的直接子项上设置属性来隐式设置.这是您修改后的主窗口XAML代码,使用了两种方式.
<StackPanel Orientation="Vertical">
<Button Content="Save"
Click="SaveButton_Click"/>
<Button Content="Load"
Click="LoadButton_Click"/>
<ad:DockingManager x:Name="myDM">
<ad:LayoutRoot>
<ad:LayoutPanel>
<ad:LayoutDocumentPane>
<ad:LayoutDocument Title="Document" ContentId="IHaveContent">
<TextBox />
</ad:LayoutDocument>
</ad:LayoutDocumentPane>
</ad:LayoutPanel>
<ad:LayoutRoot.LeftSide>
<ad:LayoutAnchorSide>
<ad:LayoutAnchorGroup>
<ad:LayoutAnchorable Title="Left">
<TextBox x:Name="IAmTextBoxContent"/>
</ad:LayoutAnchorable>
</ad:LayoutAnchorGroup>
</ad:LayoutAnchorSide>
</ad:LayoutRoot.LeftSide>
</ad:LayoutRoot>
</ad:DockingManager>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
如果现在使用"保存"和"加载"按钮,您将看到ContentId现在在测试文件中设置了属性,如下所示.
<?xml version="1.0" encoding="utf-8"?>
<LayoutRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<RootPanel Orientation="Horizontal">
<LayoutDocumentPane>
<LayoutDocument Title="Document"
IsSelected="True"
IsLastFocusedDocument="True"
ContentId="IHaveContent"
LastActivationTimeStamp="04/17/2013 09:13:35" />
</LayoutDocumentPane>
</RootPanel>
<TopSide />
<RightSide />
<LeftSide>
<LayoutAnchorGroup>
<LayoutAnchorable AutoHideMinWidth="100"
AutoHideMinHeight="100"
Title="Left"
ContentId="IAmTextBoxContent" />
</LayoutAnchorGroup>
</LeftSide>
<BottomSide />
<FloatingWindows />
<Hidden />
</LayoutRoot>
Run Code Online (Sandbox Code Playgroud)
有关如何调试此问题的未来参考,我确实使用下面的回调来调试和检查反序列化过程返回的值,其中e参数包含Model属性中的AvalonDock面板的反序列化版本(在您的case最初为null),如果ContentId属性正确,将在其Content属性中包含面板的内容(由于ContentId属性中的null值,这也是null Model).
该s回调处理程序包含了XmlLayoutSerializer参考,其中也包含了参考DockingManager,通过它你可以检查它所包含的当前项目.
我记得在早期版本的AvalonDock中遇到了类似的问题,但我认为为我修复它的是升级到最新版本(你已经拥有),因为内部部分没有正确反序列化.
但是,要尝试查找反序列化过程的问题,您可以尝试在LayoutSerializer回调中添加断点.希望这能为您提供有关特定问题的更多信息.
layoutSerializer.LayoutSerializationCallback += (s, e) =>
{
object o = e.Content;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10151 次 |
| 最近记录: |