我目前正在开发 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 窗体。
有什么办法可以让这些辅助类工作吗?或者有更好的方法吗?我不想认为我注定要将所有这些都塞进自定义控件中。在此先感谢您的任何建议!