2013-08-05 43 views
1

它看起來像一個窗體應該是獨立的,但這裏是我的困境:將兩種形式結合在一起不好嗎?

我有一個對象叫做GameMap。它存在於MapForm這是一切都很好。它可以編輯自己等。但是,我也有TilesetFormLayerForm我正在通過GameMap這些對象 - 但後來我發現我還需要通過層圖形和地圖編輯器之間的CurrentLayer,以便他們可以編輯和在另一個表格上選擇。接下來我知道 - 兩者之間的依賴關係非常緊密。該瓷磚組的唯一目的是爲了服務於MapForm,它是如何將它們映射到一起的呢?

我怎樣才能使這個顯式 - 我不能使用構造函數,因爲表單可能不是活動的 - 現在我剛剛調用SwitchContext當一個新的地圖窗體的焦點。

+0

我可以想象photoshop在地方做到這一點,你可以明顯地看到這種方法的缺點,所以我會說盡量避免它,也許有一箇中間的地方,從 – Sayse

+0

可以訪問的信息的侷限性,阻止你實現正確的模式和適當的解耦鼠疫winforms無處不在。這就是爲什麼WPF被髮明來取代它。 –

+0

@HighCore我很好奇 - WPF如何解決這個問題? –

回答

2

您通過使用事件來處理這個問題。

與其將地圖實例傳遞給地圖集並使地圖集在事件發生時直接操作地圖,在重要事件發生時定義地圖集中的事件。然後地圖可以訂閱這些事件並執行一些操作。然後,tileset不需要知道任何關於地圖的任何信息。

如果地圖在邏輯上「擁有」tileset沒有意義,那麼它甚至不會直接訂閱事件。有一個第三方(一些更高層次的概念)可以「知道」瓦片集和地圖;它會爲事件處理程序訂閱一個事件處理程序,並在事件處理程序中調用地圖上適當的方法。 (這種方法是這樣的,即使這個高層次的概念也不知道地圖的具體UI實現。)

+0

+1獲得有用的答案。這似乎是一個體面的方式來處理事情。在最糟糕的情況下,至少它是耦合到主對象的一種方式,看起來沒問題。 –