使用动态内容保存 AvalonDock 布局

Save AvalonDock layout with dynamic content

我正在尝试学习 WPF 中的 AvalonDock 环境。我有一个可锚定窗格,其中包含一个显示对象列表(基本上包含名称和值)的树视图。

我还有一些托管 UserControl 的文档窗格。我可以将树视图中的一个项目拖到一个文档中(UserControl 基本上是一个 WrapPanel)然后放下它,它添加了第二个用户控件类型(这个用户控件有一个绑定到 'name' 的文本块和一个绑定到'value') 到我的控件托管文件。

现在 - 我希望能够使用 drag/drop 创建的动态内容保存此布局。

这可能吗?使用 XmlLayoutSerializer 时,我看到生成的 xaml 有我的文档和可锚定对象,但这些项目的 none 有任何内容。

我是否应该保存对象的集合(即我绑定的 ObservableCollection)并在我想要 'restore' 视图时初始化该集合?

目的是让最终用户可以修改视图以显示他们想要的数据(来自树视图)并按照他们认为合适的方式安排布局。

感谢指点

CodeProject 上有一篇文章描述了一个解决方案: https://www.codeproject.com/articles/719143/avalondock-tutorial-part-load-save-layout

你也可以看看Gemini项目,它有更灵活的解决方案: https://github.com/tgjones/gemini/ 重要的东西在 Gemini/Framework 目录中。

这是一个纯粹的 MVVM 解决方案,它将所有文档和布局项目保存在 main/shell 视图模型中并对其进行数据绑定。在保存布局时,它会要求每个视图模型保存其状态,并且最后保留 DockingManager 状态。加载布局时,首先读取所有状态,然后在 AvalonDocks XmlLayoutSerializerLayoutSerializationCallback 事件中重新创建视图模型。这是一种很好且干净的方法,但是(据我所知)它无法处理完全在 XAML 中创建控件并使用某种消息传递(例如 Prism EventAggregator 连接到应用程序其余部分的情况).

要解决此类问题,您需要从主机 DockingManager 的视图中寻求帮助,向它索取 LayoutAnchorablesLayoutDocuments 以及 [=31] 的列表=] 他们的状态使用类似的机制。它不像原始解决方案那样优雅和纯粹的 MVVM,但我发现它更灵活。您可以将所有内容包装在几个接口和扩展方法中。

我为我的项目做了类似的事情,效果很好。可能有一天会放在 GitHub 上。