我最近打算學習 WPF ,在尋找 MVVM 框架的時候發現了 PRISM ,在此之前還從一些博客上瞭解了其他的 MVVM 框架,比如 "淺談WPF中的MVVM框架 MVVMFoundation" 中提到的 MVVMFoundation ,再比如 "ViewModel從未如此清爽 輕量級WPF MVV ...
我最近打算學習WPF ,在尋找MVVM框架的時候發現了PRISM,在此之前還從一些博客上瞭解了其他的MVVM框架,比如淺談WPF中的MVVM框架--MVVMFoundation 中提到的MVVMFoundation,再比如 ViewModel從未如此清爽 - 輕量級WPF MVVM框架Stylet 中的Stylet。在知道PRISM是微軟自家的框架的時候,就毫不猶豫的選了他,即便個人很傾向於可愛的Stylet。作為初學者,對WPF都沒有很好的瞭解的情況下,去學習使用一個WPF的框架是否真的大丈夫?好在我發現了這個Prism-Samples-Wpf,既然是WPF的應用,是否也可以作為學習WPF的示例呢?而且Prism的中文資料很少,園子里的也比較老(這貨貌似很少有人用)對新手不是太友好,所以我就將我學習Prism及WPF的過程記錄下來。如有錯誤或者理解偏頗的地方,希望大家指正。
目錄:
從PRISM開始學WPF(五)MVVM(一)ViewModel?
從PRISM開始學WPF(六)MVVM(一)Command?
0x0 WPF?
維基百科中的定義:
Windows Presentation Foundation(WPF)是美國微軟公司推出.NET Framework 3.0及以後版本的組成部分之一,它是一套基於XML、.NET Framework、向量繪圖技術的展示層開發框架,微軟視其為下一代用戶界面技術,廣泛被用於Windows Vista的界面開發。
WPF使用一種新的XAML(eXtensible Application Markup Language)語言來開發界面,這將把界面開發以及後臺邏輯很好的分開,降低了耦合度,使用戶界面設計師與程式開發者能更好的合作,降低維護和更新的成本。
如果你有C# WinForms基礎,WPF貌似就很好理解,他提供了一種界面開發方案,將界面與後臺代碼分開,而且WPF更加美觀相比醜陋的WinForms,而且,他能更好的支持縮放(高DPI下的WinForms應用簡直慘不忍睹)。
WPF像WinForms一樣可以自由拖放控制項,在Toolbox中可以看到他支持大部分常用控制項,跟WinForms的區別就是中間設計器部分,他分Design和XAML。
每一個xaml
都配有一個xaml.cs
的後臺文件,這個被稱為 code-behind(App.xaml.cs
還有MainWindow.xaml.cs
),這裡面就是我們熟悉的C#代碼。
xaml
我們不熟悉,暫且不看,我們先看看這兩個code-behind里的內容:
為了篇幅緊湊,省去了using部分
App.xaml.cs
:
namespace WpfApp1
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}
MainWindow.xaml.cs
:
namespace WpfApp1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
好像少了點什麼?
Main方法呢?開始我也這麼覺得,直到我嘗試著自己在App.xaml.cs
中寫了一個Main方法,然後編譯的時候報了個錯:
CS0111 Type 'App' already defines a member called 'Main' with the same parameter types WpfApp1 C:\Users\Yq\source\repos\DotnetTest\WpfApp1\obj\Debug\App.g.cs
原來在這裡!接下來我們看一下這個App.g.cs
:
為了篇幅緊湊,依舊省去了部分代碼
using WpfApp1;
namespace WpfApp1 {
/// <summary>
/// App
/// </summary>
public partial class App : System.Windows.Application {
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
#line 5 "..\..\App.xaml"
this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
#line default
#line hidden
}
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
WpfApp1.App app = new WpfApp1.App();
app.InitializeComponent();
app.Run();
}
}
}
雖然看不太懂,但是,不管怎樣,我們看到了我們熟悉的Main方法,他的作用也很明確 ,Application Entry Point. InitializeComponent
方法初始化了StartupUri
,他是在 App.xaml
中定義的:
StartupUri="MainWindow.xaml"