2013-01-14 16 views
0

當我們在Visual Studio(2010)中創建一個WPF項目時,它會自動創建一個MainWindow.xaml,其代碼隱藏包含一個MainWindow類,其中包含一個InitializeComponent()在裏面。我從表面上知道,在項目文件的某個地方,演示文稿中有一個相當於main()的函數,因此當應用程序GUI加載時,GUI事件會在應用程序層「向下」處理 - 只要它們存在。我應該如何將WPF MainWindow「mainloop」與應用程序邏輯的「mainloop」聯繫起來

我打算在Model-View-Presenter應用程序中開發一些東西,並且我已經嘲笑了非常基本的領域邏輯和應用程序外觀。

我的疑問是:當我有我的域名邏輯,我應該如何與應用外牆連接演示,或者更務實的態度,在哪裏以及如何(在項目文件)我應該開始「割肉出局」從應用在Visual Studio中創建一個空白的WPF應用程序。我做了一些類似於添加現有項目的東西,但沒有列出。

(編輯:從design patterns book:「一個應用程序的外觀是用領域模型中的特定對象作爲主體打開的,這個主題是所有由外觀完成的操作的起點」對於發起的一個好的開始......)

是否有任何常見的,明顯的或最佳做法的方式呢?

(另外,如果有人能提出/編輯對這個問題的一個更好的標題,我很感激)

感謝您的幫助!

+0

來自Microsoft的這份指南(儘管有點舊)很好地解釋了Rich Gui應用程序的圖層和部分:http://msdn.microsoft.com/en-us/library/ee658087.aspx – jessehouwing

+0

@jessehouwing感謝你的鏈接,實際上我已經閱讀過它,但儘管它很好地解釋瞭如何以幾乎與實現無關的方式設計應用程序(我確信我可以在Python或Java中使用這些建議),但是我看不出如何實際上是構造代碼,特別是在Visual Studio中創建空白WPF項目之後開始構建體系結構的位置,應該創建哪個文件/文件夾/項目結構等。 – heltonbiker

回答

1

該指南從微軟(雖然有點老)解釋層和豐富的GUI應用程序的部分相當不錯:http://msdn.microsoft.com/en-us/library/ee658087.aspx


如何你實際上構建項目和文件是真的取決於你。您可以在一個項目中構建獨立應用程序。您將無法輕鬆地重新使用該代碼,但您的WPF應用程序不會注意到。

您可以用多種方式對您的課程進行分組。通過名稱空間,通過程序集(項目),嵌套類等...什麼時候使用哪個通常要重新使用或分佈在不同的機器上。

當您構建一個UI部件和一個webservice部件時,您可能會將每個部件粘貼到不同的項目中。

當您想要在網站和Windows應用程序以及電話應用程序中重新使用您的商務課程時,您可能需要將它們分別粘貼到不同的項目中。

分離爲項目可以防止在類之間創建循環依賴關係。

通常情況下,您會從引用業務層引用數據層的UI的UI中獲得一系列項目。而且您經常會看到一些涉及每個參考的交叉關注問題(例如日誌記錄和安全性)這些'層'。最後,一個圖層可以映射到一個Project(程序集)或一個名稱空間(在一個項目中)。你選擇哪一個取決於你。


在WPF項目應用程序的入口點由App.xaml中指定。你會發現一個引用主窗體加載在那裏。

<Application x:Class="WpfApplication1.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml"> <-- Start up here --> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

實際入口點在您的項目設置中定義: Start Up Object

您可以在App.xaml.cs.開始任何初始化代碼最簡單的方法是訂閱OnStart事件或OnLoadCompleted事件。您也可以在MainWindow.xaml.cs代碼中啓動您的邏輯。將實際的邏輯放在一個單獨的類中,並引用來自OnStart或OnLoadCompleted事件。

StartUp event

,並添加自己的代碼有

/// <summary> 
/// Interaction logic for App.xaml 
/// </summary> 
public partial class App : Application 
{ 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 

    } 
} 

一個更好的,更多的面向對象和單元測試的方法是使用PrismMVVM Light。這些框架的範圍非常大,以至於他們自己的話題。

我不知道爲什麼你想要一個主循環。除非你打算做某種遊戲或3D渲染。在其他情況下,您可以通過向可見對象添加命令並讓Windows處理主要輸入註冊和事件分派。對於長時間運行的任務,您可以使用線程在後臺完成這些任務(different topic again)。

+0

再次感謝您的關注,但仍然是問題的核心(mainloops,邏輯inicialization,入口點)似乎沒有回答給我... :( – heltonbiker

+0

更新了我的答案。 – jessehouwing

+0

這是int eresting!我想現在我有我的預期功課要做。特別是類似OnSartup的事件。當我說「域邏輯主循環」時,我應該說「域邏輯初始化」,你稱之爲可見對象。我想一個富客戶端確實應該有一個GUI本地主循環來實際控制GUI事件,並且線程是我知道我必須在某個時候攻擊的東西。感謝您的興趣和時間! – heltonbiker