【问题标题】:Which Design Pattern suits Canvas Drawing in WPF哪种设计模式适合 WPF 中的画布绘图
【发布时间】:2012-05-18 20:14:27
【问题描述】:

我确实有一个应用程序,它处理在 WPF 画布上绘制一些线条和形状,并在绘制的线上添加许多点,比如 1000。

哪种设计模式适合 wpf 中这种高度广泛的画布绘图..

MVVM 是绘制线图和点图的更好方法吗?

非常感谢任何帮助/想法。

问候, 斯里克什 NK

【问题讨论】:

  • 确实没有足够的信息来回答。您想要在什么情况下使用模式?存储和管理线条、形状和点?还是画布?如果您希望得到一个体面的答案,请提供更详细的信息,否则我们只能猜测您可能想要什么。
  • 首先感谢您的回复,让我进一步详细说明。我确实说过 3 个屏幕来保持简单,这 3 个屏幕共享一些共同的数据。这些屏幕上的功能是画线、拖线等,并在这些画线上添加一些点。最终结果是一个包含点和线的序列化 xml 文件,但这些像素点应在序列化之前转换为一些真实世界的值,因为所有绘图都是在 WPF 画布上完成的。如果您需要更多详细信息,请告诉我。
  • 这个问题太笼统了。将您的任务拆分为子任务并分别进行分析。然后问问题,如果你不知道该怎么做。这个问题类似于:“我应该使用什么设计模式来编写操作系统”?
  • 首先:自己思考,不要指望 SO 会为你做这件事。

标签: design-patterns canvas drawing


【解决方案1】:

形状和线条绘制是特定于 UI 的,因此在 MVVM 中,这将存在于视图中。

如果您要坚持线条和形状,那么可能会涉及模型和视图模型,但老实说,设计模式似乎并没有出现在您的要求中。

MVVM、MVP、MVC——所有这些模式都是企业架构模式。他们关心解决方案层和组件的复合分解,将它们分开,以便可以测试和维护。..

画布绘图实际上并不属于特定的设计模式。当然你可以使用 MVVM,但我看不出这会影响你对绘图组件的具体实现。

【讨论】:

  • 他确实提到他想要序列化形状,但我同意你的观点,MVC 可能不会在这里发挥作用。 “企业架构模式”?那是2002年,不是吗? :) MVC 等人会不会适用于比企业更广泛的解决方案集?
  • 当然可以应用于各种场景。我在这里试图表达的观点是,与视图/UI 相关的细节(例如渲染画布)并不是真正的设计模式问题。我认为序列化也不够抽象,不足以保证设计模式的讨论。命名一种设计模式,该模式禁止诸如对象序列化之类的特定事物。
【解决方案2】:

以下是您可以考虑使用的设计的基本概述:

(我是 C++ 人,但我想你会明白的)

class ScreenBase
{
public:
    // define abstract operations here, may consider different return types
    // These may be Template Patterns depending
    // if there is common stuff to all screens
    virtual void drawLine(/* appropriate params here*/) = 0;
    virtual void dragLine(/* appropriate params here*/) = 0;
    virtual void deleteLine(/* appropriate params here*/) = 0;
    // more common operations

    // Use a Template pattern if there is common screen
    // serialization stuff, else just define it as abstract
    void serialize() {
        // do common stuff here
        doSynchronize();
        // do more common stuff here
    }

    virtual void doSynchronize(/* appropriate params here*/) = 0;
    ...

private:
    // store the drawing shapes here appropriately
};

class Screen1 : public ScreenBase
{
public:
    // concrete operation implementations
    virtual void drawLine(/* appropriate params here*/);
    virtual void dragLine(/* appropriate params here*/);
    virtual void deleteLine(/* appropriate params here*/);
    virtual void doSerialize() { ... }

    // concrete specifics here
};

// class Screen2 : public ScreenBase

// class Screen3 : public ScreenBase

// I dont know the Microsoft stuff, the shapes should be
// defined in WPF, So we wont need to define anything here.

您可以考虑使用 Stategy 设计模式,而不是实现序列化的 Screens,这将创建一个单独的序列化类或类层次结构并将其设置为 Screen(s) 上的属性

试试这个,然后随着你的进步,尝试提出更具体的问题

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2023-03-10
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多