【问题标题】:Appropriate handling of WPF Canvas (Scaling) in MVVM在 MVVM 中适当处理 WPF 画布(缩放)
【发布时间】:2015-12-15 09:09:47
【问题描述】:

模式专家的问题:我正在重构一个应用程序,该应用程序分析(大量数学!)并在画布(窗口)上绘制大量不同的几何图形。

目前实际的绘制是由 Canvas 的容器控件的 ChangeSize 事件触发的辅助类完成的。缩放/平移由使用各种鼠标事件的类似结构处理。

这是一个问题:据我了解,MVVM 将事件处理声明为邪恶,并且希望在视图模型中处理命令 - 我可以这样做,但关键是要正确定位视图模型从模型中获取的几何图形在世界坐标中,视图模型需要知道视图画布的大小,这也是邪恶的。那么,您在哪里(以及如何)进行绘图,特别是从世界坐标到屏幕(画布)的缩放。我看过价值转换器、项目模板等——但这意味着要编写大量额外的中间代码或 XAML 丛林......

我能找到的所有示例都有些简单(只有几个按钮或图片和标签),但是如何在 MVVM 中正确绘制准确的几何图形?

【问题讨论】:

  • “MVVM 将事件处理声明为邪恶”——你从哪里得到所有这些谬误? MVVM 只是希望将职责分离:视图属于什么,应该放在视图中等等。命令是视图和视图模型之间进行通信的一种方式。它不能替代事件处理程序。
  • 理解术语“事件处理”。 MVVM 中的 ICommand 或代码隐藏中的 EventHandler 方法只是不同的方式。您总是在当今的 GUI 应用程序中处理事件。此外,MVVM 是 Silverlight、Win Phone、WPF 应用程序的首选模式,不是强制。没有它也可以构建一个应用程序。当您不想遵循 MVVM 时,可能会有一些例外。比如你的应用,IMO。
  • 抱歉,如果我的“邪恶”表达踩到了某人的脚趾 - 这只是对范式的轻松描述。是的,我确实理解“事件处理”这个术语是一个更广泛的类别......但是,我的问题是,你能和/或它是否适合编写这样的应用程序而不需要任何代码。

标签: c# wpf canvas mvvm


【解决方案1】:

在我看来, MVVM 不适合您的场景。当我说 pure 时,我的意思是使用绑定来建模属性。

为了实现该模式,您必须使用Binding 将几何值绑定到Canvas,并假设您有很多形状需要在Canvas 上渲染然后@ 987654325@ 只会导致损失 性能。

请记住,Binding 依赖于 反射,在需要绘制大量几何图形(因此需要进行大量绑定)的情况下,这会大大降低 UI 速度,因此速度会更快使用视图的代码隐藏来简单地绘制几何图形。

UI 就是 UI,Data 就是 Data。我的建议是让您的视图模型进行数学运算,完成后,从视图代码隐藏中异步绘制 Canvas 上的数据。

MVVM 不是没有代码隐藏,而是将代码保留在它所属的位置。在您的情况下,从您的视图订阅视图模型事件绝对没有错。但是如果你真的想减少依赖,你可以使用messaging services

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2011-12-28
    相关资源
    最近更新 更多