c# - 阿瓦隆码头 2.0 : adding LayoutDocument not working after Deserialize layout

标签 c# wpf avalondock

仅具有 LayoutDocumentPane 的简单 AvalonDock 应用程序。 Program sample

XAML:

<Window x:Name="MainWindow1" x:Class="AvalonTest2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
        Title="MainWindow" Height="350" Width="525" Loaded="MainWindow1_Loaded">
    <Grid Name="MainGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <ToolBar Grid.Row="0" Grid.Column="0">
            <Button Content="New Tab" Margin="10,0,0,0" Click="NewTabClick"/>
            <Button Content="Save layout" Margin="10,0,0,0" Click="Button_Click"/>
        </ToolBar>

        <xcad:DockingManager x:Name="dockManager" Grid.Row="1">
            <xcad:LayoutRoot x:Name="_layoutRoot">
                <xcad:LayoutPanel Orientation="Horizontal" x:Name="_layoutPanel">
                    <xcad:LayoutDocumentPane x:Name="workSpace">
                        <xcad:LayoutDocument ContentId="dummy" Title="Dummy" >
                            <Button x:Name="dummyButton" Content="Dummy Content" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </xcad:LayoutDocument>
                    </xcad:LayoutDocumentPane>
                </xcad:LayoutPanel>
            </xcad:LayoutRoot>
        </xcad:DockingManager>
    </Grid>
</Window>

代码:

using System;
using System.IO;
using System.Windows;
using Xceed.Wpf.AvalonDock.Layout;
using Xceed.Wpf.AvalonDock.Layout.Serialization;

namespace AvalonTest2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void NewTabClick(object sender, RoutedEventArgs e)
        {
            var ld = new LayoutDocument();
            var x = new Random().Next().ToString();
            ld.Title = x;
            ld.ContentId = x;
             workSpace.Children.Add(ld);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var layoutSerial = new XmlLayoutSerializer(dockManager);
            layoutSerial.Serialize("layout.xml");
        }

        private void MainWindow1_Loaded(object sender, RoutedEventArgs e)
        {
            if (File.Exists("layout.xml"))
            {
               // var serializer = new XmlLayoutSerializer(dockManager);
               // serializer.Deserialize("layout.xml");
            }
        }
    }
}

我按下“新标签”按钮,一切都很好:新标 checkout 现。

我重新启动程序,保存布局(“保存布局”按钮),关闭程序并删除反序列化行上的注释。

我启动程序并按“新选项卡”,没有选项卡出现。我会查看 LayoutDocumentPane(工作空间)内部,“Children”属性填充有新文档。

出了什么问题?

最佳答案

不幸的是,AvalonDock 套件中的(反)序列化功能实现得不太好。

反序列化时,将创建一个全新的LayoutRoot对象。您在 XAML 中定义一个名为 workSpaceLayoutDocumentPane,并将新创建的 LayoutDocument 添加到此 Pane 中。但是,反序列化后,这个 LayoutDocumentPane 不再属于布局 - 它已被删除;相反,已创建一个新的 LayoutDocumentPane

因此,您无法看到添加到 workSpace 容器中的任何 LayoutDocument View 。

不要按名称引用 LayoutDocumentPane 实例,而是动态查找它。您必须将代码更改为:

var ld = new LayoutDocument();
var x = new Random().Next().ToString();
ld.Title = x;
ld.ContentId = x;

LayoutDocumentPane documentPane = this.dockManager.Layout.Descendents().OfType<LayoutDocumentPane>().SingleOrDefault();
if (documentPane != null)
{
    documentPane.Children.Add(ld);
}

关于c# - 阿瓦隆码头 2.0 : adding LayoutDocument not working after Deserialize layout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174320/

相关文章:

WPF 自定义 ICommand 实现和 CanExecuteChanged 事件

c# - 如何为 Last.fm api 可靠地签署请求?

c# - 散列对象集 C#

c# - asp.net 获取文件的相对路径

c# - 无法绑定(bind)到 DataContext

wpf - 单击标题时防止 WPF 扩展器扩展

c# - Avalon Dock 2.0 LayoutItemTemplateSelector 给出了 ContentPresenter 而不是 ViewModel

c# - AvalonDock 2.0 增加 handle 尺寸

c# - 如何拉伸(stretch)/最大化 AvalonDock DocumentPane

c# - 在 C# 中导入 Python 库