私は現在、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フォームを使用しない場合は、これを避けたいと思います。
これらの補助クラスを機能させる方法はありますか?それとも、これを完全に行うためのより良い方法はありますか?カスタムコントロールにすべてを詰め込む運命にあるとは思いません。提案を事前に感謝します!