下面是WF设计器结构的基本概述。如下:
这里有几个重要组成部分:
- Source:在VS中,就是XAML,但是这代表了我们正在编辑的持久存储。
- Instance:代表在内存中正在编辑的条目,对于vs2010中的WF设计器,对应一个System.Activities实例(对象树层次结构)。
- Model Item Tree :作为View和Instance之间的媒介,并负责对更改通知和跟踪比如撤消状态。
- Design View:呈现给用户的可视化的编辑视图,这个设计器是用WPF编写的。
- Metadata Store:类型和设计器之间的映射的一个属性表。
在看上面的图的时候你可能会认为,可以将DesignView直接绑定到Instance,这种方式可以工作,但会有很多问题,最明显的问题是我们的活动类型不会从DependencyObject继承或实现INotifyPropertyChanged的接口。我们也不能指定所有集合都是ObservableCollection(ObservableCollection 已从 WindowsBase.dll 移到 System.dll)。另外,我们要考虑支持一些设计时服务比如撤销/重复,而且在跨越许多对象类型的过程中我们需要确保始终能够处理这些,包括那些不是被我们写的类型。如果我们直接从View到Instance,就将二者仅仅的耦合在一起,会给我们将来做更有趣的事带来不便。例如,我们想要增加更新对象实例的重构支持,我们需要做的不仅仅是对象图,model item tree也需要跟踪很多变化。
The ModelItem tree
来看一个例子,这个例子和WF的设计器并没有直接的关系,只是来模拟这种方式:
下图是Animal与ModelItem和ModelProperty的对应关系:
下图可以看到一些具体的属性情况:
1: ModelItem root = mtm.Root;
2: Assert.IsTrue(root.GetCurrentValue() == animal, "GetCurrentValue() returns same object");
3: Assert.IsTrue(root.ItemType == typeof(Animal),"ItemType describes the item");
4: Assert.IsTrue(root.Parent == null,"root parent is null");
5: Assert.IsTrue(root.Source == null, "root source is null");
6: Assert.IsTrue(((List<Animal>)root.Properties["CloseRelatives"].ComputedValue)[0] == companion1,
7: "ComputedValue of prop == actual object");
8: Assert.IsFalse(((List<Animal>)root.Properties["CloseRelatives"].ComputedValue)[0] == companion2,
9: "ComputedValue of prop == actual object");
10: Assert.AreEqual(root.Properties["Residence"].
11: Value.
12: Properties["StreetAddress"].
13: Value.GetCurrentValue(), "123 Main Street", "get actual value back out");
14: Assert.AreEqual(root, root.Properties["Residence"].Parent, "property points to owner");
15: ModelItem location = root.Properties["Residence"].Value;
16: Assert.AreEqual(root.Properties["Residence"], location.Source, "sources point to the right place");
1: EditingContext ec = new EditingContext();
2: ModelTreeManager mtm = new ModelTreeManager(ec);
3: mtm.Load(new Sequence());
4: mtm.Root.Properties["Activities"].Collection.Add(new WriteLine());
作者:生鱼片
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
WF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器