绘图的方式在不同的类的picturebox

时间:2012-08-31 21:03:41

标签: c# .net winforms mvp

我目前正在研究WinForms中的一个程序,它需要很多特殊的逻辑来在PictureBox上进行渲染和鼠标点击。我宁愿不将所有逻辑存储在自定义控件中,或者更糟糕的是存储图片框的主要表单。更复杂的是,为了正确绘制它们或处理点击它们,需要知道某些对象。

目前,我唯一的想法是制作单独的“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;
    }
}

我无法找到让Renderer从主视图的模型中绘制FirstName和LastName的方法,而不是:

一个。通过将模型信息推送到演示者的视图,然后让视图将其推送到渲染器,为托管PictureBox的父级提供将信息推送到辅助类的工作。

或B.在演示者中添加对Forms库的引用以将所有内容绑定在一起。这将允许我从辅助类中创建视图并添加PictureBox属性,但我想避免这种情况,以防视图变为MVC应用程序或WPF应用程序,并且视图不使用Windows窗体。

有什么方法可以让这些辅助课程起作用吗?或者有更好的方法吗?我不愿意以为我注定要在自定义控件中填写所有内容。提前感谢任何建议!

1 个答案:

答案 0 :(得分:1)

在您实例化renderer的地方,为什么不给它包含对包含数据的模型对象的引用呢?当然,它是“A”方式,但是当你“手动”将它很难绑定到PictureBox时,所以我没有看到任何错误,另外将模型实例与picbox一起传递。对我来说,当我创建一个对象并进行配置时,我似乎很自然地完全配置它。否则,您必须添加一些渲染器构建层,因为渲染器自然必须以某种方式获取数据..

实际上,将模型提供给渲染器并不是(至少对我来说)架构中的任何违规行为,并且不会给“主机”带来任何额外的负担/逻辑,前提是您将通过“整个模型”和渲染器将​​负责读取所需的实际数据。恕我直言,以这种方式,一切都将完全正确。