私は、WPFキャンバスにいくつかの線と形状を描画し、描画された線に1000と言う多くの点を追加するアプリケーションを持っています。
wpf でのこの非常に広範なキャンバスの描画に適したデザインパターンはどれですか..
MVVM は、この線画と点プロットのためのより良いアプローチですか?
ヘルプ/アイデアは大歓迎です。
よろしく、 Sreekesh NK
私は、WPFキャンバスにいくつかの線と形状を描画し、描画された線に1000と言う多くの点を追加するアプリケーションを持っています。
wpf でのこの非常に広範なキャンバスの描画に適したデザインパターンはどれですか..
MVVM は、この線画と点プロットのためのより良いアプローチですか?
ヘルプ/アイデアは大歓迎です。
よろしく、 Sreekesh NK
形状と線の描画は UI 固有であるため、MVVM ではこれはビューに存在します。
線と形状を永続化する場合は、モデルとビューモデルが関与する可能性がありますが、正直なところ、設計パターンはあなたが求めているものに入っていないようです.
MVVM、MVP、MVC - これらのパターンはすべてエンタープライズ アーキテクチャ パターンです。彼らは、ソリューションのレイヤーとコンポーネントの複合的な内訳に関心を持っており、テストと保守ができるようにそれらを分離しておきます。
キャンバスの描画は、実際には特定のデザイン パターンには当てはまりません。確かにMVVMを使用できますが、描画コンポーネントの特定の実装に影響を与えることはわかりません。
以下は、使用を検討できる設計の基本的な概要です。
(私は 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.
シリアライゼーションを実装する画面の代わりに、別のシリアライゼーション クラスまたはクラス階層を作成し、それを画面の属性として設定する戦略設計パターンの使用を検討することができます。
これを試してから、さらに進んだら、より具体的な質問をしてみてください