我目前正在研究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窗体。
有什么方法可以让这些辅助课程起作用吗?或者有更好的方法吗?我不愿意以为我注定要在自定义控件中填写所有内容。提前感谢任何建议!
答案 0 :(得分:1)
在您实例化renderer
的地方,为什么不给它包含对包含数据的模型对象的引用呢?当然,它是“A”方式,但是当你“手动”将它很难绑定到PictureBox时,所以我没有看到任何错误,另外将模型实例与picbox一起传递。对我来说,当我创建一个对象并进行配置时,我似乎很自然地完全配置它。否则,您必须添加一些渲染器构建层,因为渲染器自然必须以某种方式获取数据..
实际上,将模型提供给渲染器并不是(至少对我来说)架构中的任何违规行为,并且不会给“主机”带来任何额外的负担/逻辑,前提是您将通过“整个模型”和渲染器将负责读取所需的实际数据。恕我直言,以这种方式,一切都将完全正确。