0

我目前正在开发 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;
    }
}

我想不出一种方法让渲染器从主视图的模型中绘制名字和姓氏:

A. 通过将模型信息从演示者推送到视图,然后让视图将其推送到渲染器,让托管 PictureBox 的父级将信息推送到辅助类。

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

有什么办法可以让这些辅助类工作吗?或者有更好的方法吗?我不想认为我注定要将所有这些都塞进自定义控件中。在此先感谢您的任何建议!

4

1 回答 1

1

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

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

于 2012-08-31T22:44:06.830 回答