我正在尝试学习WPF中的AvalonDock环境。我有一个可锚定的窗格,其中包含一个显示对象列表的树视图(基本上包含一个名称和值)。
我还有一些托管UserControl的文档窗格。我可以将一个项目从树视图拖动到一个文档(UserControl,它基本上是一个WrapPanel),然后删除它,它添加了第二个用户控件类型(此用户控件有一个绑定到'name'的文本块和一个绑定到'value'的文本框')由我的文件托管。
现在 - 我希望能够使用拖放创建的动态内容保存此布局。
这可能吗?使用XmlLayoutSerializer时,我看到生成的xaml包含我的文档和anchorables,但这些项目都没有任何内容。
我应该保存一组对象(即我绑定的ObservableCollection)并在我想要“恢复”视图时初始化该集合吗?
目的是让最终用户可以修改以显示他们想要的数据(从树视图)并根据需要排列布局。
感谢您的任何指示
答案 0 :(得分:0)
有一篇关于CodeProject的文章描述了一个解决方案: https://www.codeproject.com/articles/719143/avalondock-tutorial-part-load-save-layout
您还可以查看Gemini项目,该项目具有更灵活的解决方案: https://github.com/tgjones/gemini/ 重要的是在Gemini / Framework目录中。
它是一个纯MVVM解决方案,它将所有文档和布局项保存在主/ shell视图模型中并对其进行数据绑定。在保存布局时,它会要求每个视图模型保存其状态,并且DockingManager
状态最后保留。在加载布局时,首先读取所有状态,然后在AvalonDocks LayoutSerializationCallback
的{{1}}事件中重新创建视图模型。这是一个很好的干净方法,但是(AFAIK)当控件纯粹在XAML中创建并使用某种消息传递(例如Prism XmlLayoutSerializer
)连接到应用程序的其余部分时,它无法处理这种情况。 p>
要解决此类问题,您需要来自托管EventAggregator
的视图的帮助,要求其提供DockingManager
和LayoutAnchorables
的列表并保存/加载他们的州使用类似的机制。它不像原始解决方案那样优雅和纯粹的MVVM,但我发现它更灵活。您可以将所有内容包装在一些接口和扩展方法中。
我为我的项目做了类似的事情,效果很好。有一天可能会把它放在GitHub上。