我目前正在研究WinForms中的一個程序,這需要很多特殊的邏輯來在PictureBox上進行渲染和鼠標點擊。我寧願不把所有這些邏輯都存儲在自定義控件中,或者更糟的是託管圖片框的主要形式。另外一個複雜的情況是,爲了正確繪製或點擊它們,需要了解某些對象。在不同類別的繪圖盒上繪圖的方式
目前,我唯一的想法是製作單獨的「渲染器」和「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.在演示者中添加對Forms庫的引用,將所有內容綁定在一起。這將允許我從輔助類中創建視圖並添加一個PictureBox屬性,但是我想避免這種情況,以防視圖變成MVC應用程序或WPF應用程序,並且視圖不使用Windows窗體。
有沒有什麼辦法可以讓這些輔助類工作?或者是完全有更好的方法嗎?我討厭認爲我註定要在自定義控件中塞滿它。在此先感謝您的任何建議!
你應該使用自己的'Control'(可能是雙緩衝的),而不是PictureBox。 – SLaks
這是真的,它實際上是我爲實際程序所做的。事實上,目前它「工作」很好。我只是覺得有一種觀點,那種內心的邏輯會破壞MVP的目的。 –