在C#WPF / MVVM中构建图像(绘制线条,圆弧,文本)

时间:2010-12-21 07:15:19

标签: c# graphics wpf-controls

在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(不是业务级别)更深,但是我保留得越高,代码就会越多,无法进行单元测试。

2 个答案:

答案 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对被动视图进行正确调用。您创建一个“模拟”视图并将其传递给演示者。