gpt4 book ai didi

c# - 使用动态内容保存 AvalonDock 布局

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:25 25 4
gpt4 key购买 nike

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

我还有一些托管 UserControl 的文档 Pane 。我可以将一个项目从 TreeView 拖到一个文档中(UserControl 基本上是一个 WrapPanel)然后放下它,它添加了第二个用户控件类型(这个用户控件有一个绑定(bind)到“名称”的文本 block 和一个绑定(bind)到“值”的文本框') 由文档托管到我的控件中。

现在 - 我希望能够保存此布局 - 以及通过拖放创建的动态内容。

这可能吗?使用 XmlLayoutSerializer 时,我看到生成的 xaml 有我的文档和 anchor ,但这些项目都没有任何内容。

我是否应该保存对象的集合(即我绑定(bind)的 ObservableCollection)并在我想“恢复” View 时初始化该集合?

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

感谢指点

最佳答案

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

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

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

要解决此类问题,您需要来自托管 DockingManager 的 View 的帮助,向它询问 LayoutAnchorablesLayoutDocuments 并使用类似的机制保存/加载它们的状态。它不像原始解决方案那样优雅和纯粹的 MVVM,但我发现它更灵活。您可以将所有内容包装在几个接口(interface)和扩展方法中。

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

关于c# - 使用动态内容保存 AvalonDock 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com