0

私は現在、PictureBoxでのレンダリングとマウスクリックのために多くの特別なロジックを必要とするWinFormsのプログラムに取り組んでいます。そのロジックのすべてをカスタムコントロールに保存したり、さらに悪いことに、画像ボックスをホストするメインフォームに保存したりしたくありません。さらに複雑なのは、オブジェクトを正しく描画したり、クリックを処理したりするために知っておく必要のある特定のオブジェクトがあることです。

現在、私が持っている唯一のアイデアは、画像ボックスへのハンドルを持つ「Renderer」クラスと「MouseHandler」クラスを別々に作成することであり、その中のすべてのイベントを処理できます。問題は、MVP構造を維持しながらこれを行うことです。

そこで、何が起こっているのかをよりよく説明するための小さなサンプルコードを次に示します。

メインフォーム

public partial class Form1 : Form, IView
{
    private Renderer _render;
    private MouseHandler _mouseHandler;

    public Form1() { InitializeComponent(); }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        _render = new Renderer(Picbox);
        _mouseHandler = new MouseHandler(Picbox);
    }

    #region Implementation of IView

    public string FirstName { get; set; }
    public string LastName { get; set; }

    #endregion
}

メインフォームのプレゼンター

public class Presenter
{
    private readonly IView _view;
    private readonly Model _model;

    public Presenter(IView view)
    {
        _view = view;
        _model = new Model("John", "Doe");
    }
}

レンダラー

public class Renderer
    {
        private readonly PictureBox _pictureBox;

        public Renderer(PictureBox pictureBox)
        {
            _pictureBox = pictureBox;
            _pictureBox.Paint += PictureBoxOnPaint;
        }

        private static void PictureBoxOnPaint(object sender, PaintEventArgs e)
        {
            // TODO: Draw stuff like First and Last Name
        }

        public void Refresh() { _pictureBox.Invalidate(); }
    }

モデル

public class Model
{
    private string FirstName { get; set; }
    private string LastName { get; set; }

    public Model(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }
}

以下がないと、レンダラーにメインビューのモデルからFirstNameとLastNameを描画させる方法がわかりません。

A.モデル情報をプレゼンターからビューにプッシュし、ビューにそれをレンダラーにプッシュさせることにより、PictureBoxをホストしている親に情報を補助クラスにプッシュするジョブを与えます。

またはB.プレゼンターのフォームライブラリへの参照を追加して、すべてを結び付けます。これにより、補助クラスからビューを作成し、PictureBoxプロパティを追加できますが、ビューがMVCアプリケーションまたはWPFアプリケーションに変わり、ビューがWindowsフォームを使用しない場合は、これを避けたいと思います。

これらの補助クラスを機能させる方法はありますか?それとも、これを完全に行うためのより良い方法はありますか?カスタムコントロールにすべてを詰め込む運命にあるとは思いません。提案を事前に感謝します!

4

1 に答える 1

1

インスタンス化する場所でrenderer、データを含むモデルオブジェクトへの参照を指定してみませんか?確かに、これは「A」の方法ですが、「手動で」PictureBoxにバインドしているので、picboxと一緒にモデルインスタンスを追加で渡すことに何の問題もありません。オブジェクトを作成して構成するときに、完全に構成するのは自然なことのように思えます。それ以外の場合は、レンダラーが何らかの方法でデータを取得する必要があるため、レンダラー構築レイヤーを追加する必要があります。

実際、レンダラーにモデルを提供することは、(少なくとも私にとっては)アーキテクチャの違反ではなく、「モデル全体」を渡すことを条件として、「ホスティング業者」に余分な負担/ロジックを課すことはありません。必要な実際のデータを読み取る責任があります。私見、そのような方法で、すべてがその場所で正確に正しいでしょう。

于 2012-08-31T22:44:06.830 に答える