(一)創建一個簡單的WPF應用


首先,在這里我要說明的是:這里的例子,都是通過控制台程序來創建WPF應用,而非使用現成的WPF模版。因為WPF模版封裝了創建WPF應用所需要的各種基本元素,並不利於我們學習。


 

創建一個WPF需要引用的最基本的DLL

1、PersentationCore                       WPF的核心類庫

2、PersentationFramework             封裝了與WPF控件相關類型的類庫

3、System.Xaml                             XAML解析的類庫

4、WindowBase                              Window窗體相關的類庫

 

引入了這四個類庫之后 我們就可以創建自己的WPF App了

 

Demo:

class SimpleWPF
    {
        //與Console、Winform一樣 WPF自身也是單線程模型
        [STAThread]
        static void Main()
        {
            //Window 是WPF中標准的窗體呈現方式   
            Window mainWindow = new Window();
            mainWindow.Title = "這是一個簡單的WPF應用";
            
            //Application類型用於創建一個消息循環 使用戶可以接受來自輸入設備的輸入
            Application app = new Application();

            Console.WriteLine("Simple WPF Running");

            app.Run(mainWindow);


            #region 等效方式

            //mainWindow.Show();//顯示窗體
        //app.Run();//先建立消息循環
#endregion } }

在這個例子里 大家應該可以看到 在單線程的主入口點中,我聲明了一個Window對象 和一個Application對象。

這兩個對象是做什么的呢?我在這里解釋下

 

System.Windows.Application對象 是創建一個消息循環,用以接受用戶的各類輸入事件,以及阻止控制台程序的結束

System.Windows.Window對象  是WPF中標准的窗體類型。

這里提供了一個繼承關系的樹形截圖

  

 

從此截圖可以看出 Window類型實際是一個ContentControl類型。 對於Control類型的講解,我們會后期的文章中說明

Window類型還有一個孿生兄弟 叫UserControl,位於System.Windows.Controls命名空間下,UserControl與Window不同,Window會被視為窗體,而UserControl顧名思義被視為一個封裝好的用戶控件。

 

Application在運行的時候,可以創建一個默認Window窗體並直接調用窗體的Show()方法進行顯示,也可以由Window調用自己的Show()並調用Application的Run()方式來完成窗體的顯示以及消息循環的建立。同時Application會將第一個調用了Show()的窗體認作MainWindow 並可以通過Application的MainWindow屬性獲取及設置新的MainWindow

 

因為程序是通過控制台來創建的GUI,我們在運行時除了會看到Window窗體,還會看到Console控制台。我們可以通過Console.WriteLine()來輸出各類調試信息,因此在程序發布之前 建議使用這種方式來進行調試。如果不希望看到Console,可以修改項目屬性為Windows應用程序,如下圖

 

以上就是如何創建一個簡單的WPF應用了,很多人可能還會疑惑,這么創建的WPF應用程序跟拿模版創建的差距咋就那么大呢,下面我用一個例子來告訴大家,模版都做了什么,它的好處在哪。

 

  這是一個模版生成的WPF應用程序。我們來模擬它

 

  MainWindow 我們只關心他的cs文件, MainWindow類型也是繼承自Window類型,在MainWindow類型里 我們可以重寫On[Event]行為來達到對各種Window窗體的事件的處理

  App 分為兩部分 一部分為Xaml 其中有個重要的屬性StarupURI 定義了主窗體的類型,另一部分是App.Xaml.cs 繼承自Application類型,讓我們可以使用Application生命周期中產生的各種事件

  App生命周期中有三個特別重要的事件

  OnStartup 創建消息循環時觸發

  OnExit       結束消息循環時觸發

  OnSessionEnding 系統進行關機操作時觸發

  在這個例子里 我們將對窗口的創建 延遲到了Application 的 Startup事件中,也就是由Application來管理窗體的創建和銷毀

    上代碼:

  主入口點 負責創建Application消息循環

 
class Programs { [STAThread] static void Main() { App app = new App(); Console.WriteLine("App.Run()"); app.Run(); } }

  Application類,我們在Stratup事件中創建Window實例,並且向控制台中輸出創建信息

 public class App : Application
    {
        /// <summary>
        /// 程序運行時觸發的事件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            WPF_ApplicationAndWindow.NormalWPF.MainWindow mainWindow = new MainWindow();


            Console.WriteLine("Application StartUp And Main Window.Show()");
            mainWindow.Show();
        }

        //關機時觸發的事件
        protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
        {
            base.OnSessionEnding(e);

            Console.WriteLine("Session Ending");
        }

        //退出WPF時觸發的事件
        protected override void OnExit(ExitEventArgs e)
        {
            base.OnExit(e);

            Console.WriteLine("Exit Application");
        }
    }

Window 這個就不多說啥了

public class MainWindow : Window
    {
        public MainWindow()
        {
            this.Title = "MainWindow";

        }
        //獲取鼠標在窗體內的點擊事件
        protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);
            
            //由於此窗體就是接受事件的窗體 所以這里用This
            string message = string.Format("MouseDown on Point {0}", e.GetPosition(this));


            //輸出控制台
            Console.WriteLine(message);

            MessageBox.Show(message, this.Title);
        }
    }

 

  Application對象常用屬性

  1、MainWindow

  獲取當前Application中的主窗體,如果不進行修改,默認獲取到的是第一個調用Show()的窗體對象

  2、Windows

  獲取當前Application管理的所有窗體實例 集合類型

  3、ShutdownModel

  這是一個枚舉類型,用以決定何時應該結束這個Application的聲明周期,枚舉值有三個

  OnExplicitShutdown  只有在調用Application.Shutdown()方法時 才能結束生命周期

  OnLastWindowClose 當Application所管理的所有窗體都關閉時 結束生命周期

  OnMainWindowClose 當Application所管理的MainWindow關閉時 結束生命周期

  4、Current (Static)

  這是一個靜態屬性,直接通過Application.Current獲取,這個屬性獲取了當前使用的Application實例

  Window對象的常用屬性

  1、Owner 

  設置當前實例化的窗體隸屬於哪個窗體,當設置此屬性后,當前實例化窗體會受設置的窗體管理,具有相同的生命周期,並且會一直顯示在設置的窗體前面

  2、Owners

  獲取當前窗體所擁有的所有子窗體列表

  3、ShowInTaskBar

  這是一個bool類型,決定窗體是否會顯示在Windows任務欄中

  4、WindowStartupLocation

  枚舉類型,決定了窗體初始顯示位置

  5、WindowStyle

  枚舉類型,決定了窗體邊框類型 默認為SingleBorderWindow 擁有一個最大化、最小化、關閉按鈕

  6、WindowState

  枚舉類型,決定了窗體在Show()之后的顯示方式 默認為Normal  最大化 最小化 還是正常顯示

 

  本篇就講到這里,下一篇會講與WPF相關的一個很重要的概念 “設備無關像素/邏輯像素"

  

  Tips:

  說句心里話,每次寫Blog都很揪心,很忐忑。生怕自己寫錯了什么,誤導了別人,也給自己挖了坑。這篇文章里的東西不一定完全正確,因為畢竟我也算是一個初學者,如果有誰看到了其中的失誤或者錯誤,請及時提醒我。曾經也做過WPF的項目,拖拽控件、查找源碼,用過MVVM模式,也是一個CCCV CCAV黨,雖然號稱有半年的WPF開發經驗,實際上真正從頭系統了解WPF的時候,才發現了自己曾經一知半解的很多,誤解的知識也很多。希望以后的日子里能跟大家共同進步,擺脫拖拽工人的模式……

 

  這里提供附件下載(.Net 4.0+VS2010開發): 

  http://files.cnblogs.com/ShadowLoki/WPF_ApplicationAndWindow.rar 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM