【问题标题】:Way of drawing on picturebox in different class不同类的picturebox上的绘图方式
【发布时间】:2012-08-31 21:03:41
【问题描述】:

我目前正在开发一个 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 窗体。

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

【问题讨论】:

  • 您应该使用自己的Control(可能是双缓冲),而不是 PictureBox。
  • 这是真的,这实际上是我为实际程序所做的。事实上,目前它“工作”得很好。我只是觉得有这么多逻辑的观点违背了 MVP 的目的。

标签: c# .net winforms mvp


【解决方案1】:

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

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

【讨论】:

  • 嗯,原因是因为 Windows 框架的设置方式(至少在我看来是这样),没有办法用完成工作所需的对象巧妙地实例化所有内容。我需要的东西:
  • Snip 没关系之前的评论。你是对的。我不会使用对整个模型的引用,但是让视图推送属性更改为渲染对象基本上与将属性更改推送到文本框没有什么不同。所以,我想我会这样处理。方法A就是这样。
猜你喜欢
  • 2012-07-17
  • 2021-06-28
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多