2012-08-31 28 views
0

我目前正在研究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窗體。

有沒有什麼辦法可以讓這些輔助類工作?或者是完全有更好的方法嗎?我討厭認爲我註定要在自定義控件中塞滿它。在此先感謝您的任何建議!

+0

你應該使用自己的'Control'(可能是雙緩衝的),而不是PictureBox。 – SLaks

+0

這是真的,它實際上是我爲實際程序所做的。事實上,目前它「工作」很好。我只是覺得有一種觀點,那種內心的邏輯會破壞MVP的目的。 –

回答

1

在實例化renderer的地方,爲什麼不給它提供包含數據的模型對象?當然,這是「A」方式,但是由於您手動將它綁定到PictureBox上很難,所以我沒有看到任何錯誤將模型實例與picbox一起傳遞。當我創建一個對象並對其進行配置時,我覺得很自然 - 我完全配置它。否則,你必須添加一些渲染器構建層,因爲自然,渲染器只是必須以某種方式獲取數據。

實際上,將渲染模型賦予渲染器不是(至少對我來說)任何如果您將通過「整個模型」並且渲染器將負責讀取其需要的實際數據,則不會在「託管方」中放置任何額外的負擔/邏輯。恕我直言,以這種方式,一切將完全正確的地方。

+0

那麼原因是因爲Windows框架的設置方式(至少對我來說似乎是這樣),沒有辦法用工作所需的對象來整齊地實例化所有東西。我需要的東西: –

+0

* Snip * Nevermind the previous comment。您是對的。我不會使用對整個模型的引用,但是將視圖推送到渲染對象的屬性更改與將屬性更改推送到文本框基本上沒有區別。所以,我想我會這樣處理。方法A它是。 –