天天看點

WPF筆記(1.1 WPF基礎)——Hello,WPF!

WPF筆記(1.1 WPF基礎)——Hello,WPF!

Example 1-1. Minimal C# WPF application

WPF筆記(1.1 WPF基礎)——Hello,WPF!

// MyApp.cs

WPF筆記(1.1 WPF基礎)——Hello,WPF!

using System;

WPF筆記(1.1 WPF基礎)——Hello,WPF!

using System.Windows; // the root WPF namespace

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

namespace MyFirstAvalonApp 

WPF筆記(1.1 WPF基礎)——Hello,WPF!

{

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

  class MyApp 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

    [STAThread]

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

    static void Main(  ) 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

      // the WPF message box

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      MessageBox.Show("Hello, Avalon");

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    }

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  }

WPF筆記(1.1 WPF基礎)——Hello,WPF!

}

1。這裡,在project中要事先導入3個framework的dll,分别是WindowsBase,PresentationCore,PresentatioFramework,這樣你才可以使用新的System.Windows——來自\Framework\v3.0\WindowsBase.dll,而不是\Framework\v2.0.50727\System.Windows.Forms.dll,進而增加了很多新的功能。

2。注意,vs2005下是看不到Main的,是以這麼玩就不行;找到App.g.cs這樣的檔案,Main代碼藏在這裡,對其進行相應改動。vs2005下自動找Main的小技巧:因為App類是分散類,是以右擊函數定義,會找到兩個地方,一個就是本頁App.xaml.cs,另一個會定向到App.g.cs檔案。

WPF筆記(1.1 WPF基礎)——Hello,WPF!

Example 1-3. A minimal msbuild project file

WPF筆記(1.1 WPF基礎)——Hello,WPF!

<!-- 1st.csproj -->

WPF筆記(1.1 WPF基礎)——Hello,WPF!

<Project

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  DefaultTargets="Build"

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  xmlns="http://schemas.microsoft.com/developer/msbuild 

WPF筆記(1.1 WPF基礎)——Hello,WPF!

/2003">

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  <PropertyGroup>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <OutputType>winexe</OutputType>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <OutputPath>.\</OutputPath>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <Assembly>1st.exe</Assembly>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  </PropertyGroup>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  <ItemGroup>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <Compile Include="MyApp.cs" />

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <Reference Include="System" />

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <Reference Include="WindowsBase" />

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <Reference Include="PresentationCore" />

WPF筆記(1.1 WPF基礎)——Hello,WPF!

    <Reference Include="PresentationFramework" />

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  </ItemGroup>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

  <Import Project="$(MsbuildBinPath)\Microsoft.CSharp.targets" />

WPF筆記(1.1 WPF基礎)——Hello,WPF!

</Project>

WPF筆記(1.1 WPF基礎)——Hello,WPF!

1。就是把*.csproj 工程檔案用記事本打開看到的東西啦。相應指令行msbuild。總之,是vs2005所原有的。

2。倒數第二行有點意思,查了一下别人的blog,

Microsoft.CSharp.targets位于C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目錄下

用記事本打開,是一個XML檔案,記錄了生成項目的所有步驟。

WPF筆記(1.1 WPF基礎)——Hello,WPF!

Example 1-5. A less minimal WPF application

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

using System.Windows;

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

  class MyApp : Application 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

    static void Main(string[] args) 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

      MyApp app = new MyApp(  );

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      app.StartingUp += app.AppStartingUp;

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      app.Run(args);

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

    void AppStartingUp(object sender, StartingUpCancelEventArgs 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

 e) 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

      // By default, when all top level windows

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      // are closed, the app shuts down

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      Window window = new Window(  );

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      window.Text = "Hello, Avalon";

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      window.Show(  );

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

1。這個例子有文法問題,可能是寫書的時候還是WinFX,是以StartingUpCacalEventArgs事件應該改為StartUpEventArgs, 也可以不在Main裡面做,

在App.xaml的Starting屬性指定就可以了。Window還沒有Text屬性,相應的要改為window.Title

2。MyApp:Application

看到這裡,不得不說了。其實WPF分為兩種,一種是Window Application(C/S),使用Window标簽;另一種是Browser Application(B/S),使用Page标簽。但是WPF的Project,都用App.xaml檔案作為入口,相應标簽是Application,app.xaml中寫Main函數,但是一般不可見,隐藏在app.g.cs檔案中(分散類機制)。App.xaml的Application标簽中,用StartupUri屬性指定第一個打開的Form/Page是哪一個。具體的xaml文法見後。

WPF筆記(1.1 WPF基礎)——Hello,WPF!

Example 1-6. Window class declaring its own controls

WPF筆記(1.1 WPF基礎)——Hello,WPF!

// Window1.cs

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

using System.Windows.Controls; // Button et al

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

  class Window1 : Window 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

    public Window1(  ) 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

      this.Text = "Hello, Avalon";

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

      // Do something interesting (sorta

WPF筆記(1.1 WPF基礎)——Hello,WPF!

)

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      Button button = new Button(  );

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      button.Content = "Click me, baby, one more time!";

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      button.Width = 200;

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      button.Height = 25;

WPF筆記(1.1 WPF基礎)——Hello,WPF!

      button.Click += button_Click;

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

      this.AddChild(button);

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

    void button_Click(object sender, RoutedEventArgs e) 

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

      MessageBox.Show(

WPF筆記(1.1 WPF基礎)——Hello,WPF!

        "You've done that before, haven't you

WPF筆記(1.1 WPF基礎)——Hello,WPF!

",

WPF筆記(1.1 WPF基礎)——Hello,WPF!

        "Nice!");

WPF筆記(1.1 WPF基礎)——Hello,WPF!
WPF筆記(1.1 WPF基礎)——Hello,WPF!

1。寫到這裡我要罵人了,初學者都會上當在這裡。我是調試了半天沒有成功。原因很簡單,沒有搞清楚vs2005自動生成的一些代碼。一個是Main函數,不要用他的,自己寫app.Run(new Window1);還有就是window的InitializeComponent方法所在那個部分類,全部mark掉,不用那個初始化方法,這樣就不和加載新button沖突了。唉,其實vs也是好意,我們真正開發還是要用vs的,但是現階段學習用例,确實vs會造成困惑。

2。其實還有一種等價寫法,就是充分利用xaml中的聲明,如<Button x:Name="button1",這樣相應的背景可以直接使用這個button1對象——xaml語言等價于對象模組化。而這種方法的實質就是vs2005自動生成的InitializeComponent方法,它是加載這個xaml檔案,将其序列化為對象,加載到Application級别中,接下來就可以使用了。

3。例1.7——1.13講的就是我上面所述的。總之這本書的寫作順序不對,應該指出來前面先不要用vs2005,而後講vs的玩法及原理,最後再展示vs上開發的例子——這樣就對了。