【发布时间】: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 的目的。