原文:
WPF筆記(1.1 WPF基礎)——Hello,WPF!
Example
1
-
1
. Minimal C# WPF application
//
MyApp.cs
using
System;
using
System.Windows;
//
the root WPF namespace
namespace
MyFirstAvalonApp
{
class MyApp {
[STAThread]
static void Main( ) {
// the WPF message box
MessageBox.Show("Hello, Avalon");
}
}
}
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文件。html
Example
1
-
3
. A minimal msbuild project file
<!--
1st.csproj
-->
<
Project
DefaultTargets
=
"
Build
"
xmlns
=
"
http://schemas.microsoft.com/developer/msbuild
/
2003
"
>
<
PropertyGroup
>
<
OutputType
>
winexe
</
OutputType
>
<
OutputPath
>
.\
</
OutputPath
>
<
Assembly
>
1st.exe
</
Assembly
>
</
PropertyGroup
>
<
ItemGroup
>
<
Compile Include
=
"
MyApp.cs
"
/>
<
Reference Include
=
"
System
"
/>
<
Reference Include
=
"
WindowsBase
"
/>
<
Reference Include
=
"
PresentationCore
"
/>
<
Reference Include
=
"
PresentationFramework
"
/>
</
ItemGroup
>
<
Import Project
=
"
$(MsbuildBinPath)\Microsoft.CSharp.targets
"
/>
</
Project
>
1。就是把*.csproj 工程文件用記事本打開看到的東西啦。相應命令行msbuild。總之,是vs2005所原有的。
2。倒數第二行有點意思,查了一下別人的blog, windows
Microsoft.CSharp.targets位於C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目錄下 |
用記事本打開,是一個XML文件,記錄了生成項目的全部步驟。
Example
1
-
5
. A less minimal WPF application
//
MyApp.cs
using
System;
using
System.Windows;
namespace
MyFirstAvalonApp
{
class MyApp : Application {
[STAThread]
static void Main(string[] args) {
MyApp app = new MyApp( );
app.StartingUp += app.AppStartingUp;
app.Run(args);
}
void AppStartingUp(object sender, StartingUpCancelEventArgs
e) {
// By default, when all top level windows
// are closed, the app shuts down
Window window = new Window( );
window.Text = "Hello, Avalon";
window.Show( );
}
}
}
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語法見後。
app
Example
1
-
6
. Window
class
declaring its own controls
//
Window1.cs
using
System;
using
System.Windows;
using
System.Windows.Controls;
//
Button et al
namespace
MyFirstAvalonApp
{
class Window1 : Window {
public Window1( ) {
this.Text = "Hello, Avalon";
// Do something interesting (sorta)
Button button = new Button( );
button.Content = "Click me, baby, one more time!";
button.Width = 200;
button.Height = 25;
button.Click += button_Click;
this.AddChild(button);
}
void button_Click(object sender, RoutedEventArgs e) {
MessageBox.Show(
"You've done that before, haven't you",
"Nice!");
}
}
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上開發的例子——這樣就對了。
less