在WPF独立应用程序中,我需要根据一系列“命令”绘制图像,例如“位置x,y处的文本a”和“从x1,y1到x2,y2的绘制线”。
我的问题和注意事项概述如下 - 非常感谢任何帮助和评论!
图片是我公司建造的水泵。
这些命令由我们公司内的专有系统生成。
解释命令没有问题。
我的问题是
a)我应该选择什么样的WPF控件来“开启”?
b)如何将代码的主要部分移动到可单元测试的类中?
a1)我尝试过使用PathGeometry,它非常适合绘制几何形状但不能绘制文本。
a2)我尝试使用Shape,它支持绘图文本,但在几何方面不太先进。
a3)我可以使用两者中的强度,并将PathGeometry“应用”给Shape吗?
a4)我需要在绘图后处理MouseOver以根据鼠标位置突出显示。它可以通过计算“幕后”对象最接近鼠标位置来完成(虽然可能,它很重!)但是渲染Control的选择可以帮助我吗?
b1)我不认为最终图纸可以进行测试吗?
b2)我应该如何“深入”引用属于GUI的控件? Gut的感觉并不比ViewModel(不是业务级别)更深,但是我保留得越高,代码就会越多,无法进行单元测试。
答案 0 :(得分:1)
以下是WPF特有的答案:
你可以在Canvas上画画,它可以让你设置元素的位置(Canvas.SetLeft,Canvas.SetTop,...)
你可以完美地使用PathGeometry,Shape等......你还应该在GeometryGroup处设置一个循环,它允许将所有几何体组合为一个。
对于文本,如果您希望将文本作为几何图形,则可以将FormattedText与BuildGeometry方法一起使用。
答案 1 :(得分:0)
关于单元测试。
WPF数据绑定非常适合绑定数据,例如字符串到文本框。使用用户命令不太好。告诉用户界面执行操作会更糟糕,例如“绘制线条” - 您可能会想出一些与形状视图模型集合绑定的时髦ItemPresenter,但我想它会很难并会引入太多不必要的文物。底线:MVVM可能不适合这个项目。
相反,您可以使用"passive view" approach。您可以为视图定义与控件无关的“虚拟机”界面。像
这样的东西interface IView
{
void AddLine(int x1, int y1, int x2, int y2);
void DrawText(...);
}
您的视图应该以最小的逻辑直接实现此接口:每个方法最多2-3行,没有条件或循环。这是一个“愚蠢”的被动视图,这是不可测试的。
系统的其余部分(即Presenter)与IView接口进行通信,对WPF或控件一无所知。好吧,它可能会使用一些简单的WPF类型,比如Color或Rectangle。
您可以使用模拟库(例如Rhino Mocks)编写测试,以确保您的Presenter对被动视图进行正确调用。您创建一个“模拟”视图并将其传递给演示者。