WPF笔记(1.1 WPF基础)——Hello,WPF!

简介: 原文:WPF笔记(1.1 WPF基础)——Hello,WPF! Example 1-1. Minimal C# WPF application// MyApp.csusing System;using System.
原文: WPF笔记(1.1 WPF基础)——Hello,WPF!

 
img_a6339ee3e57d1d52bc7d02b338e15a60.gif Example  1 - 1 . Minimal C# WPF application
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
//  MyApp.cs
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System.Windows;  //  the root WPF namespace
img_a6339ee3e57d1d52bc7d02b338e15a60.gif

img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
namespace  MyFirstAvalonApp  img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
class MyApp img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif    [STAThread]
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
static void Main(  ) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif      
// the WPF message box
img_33d02437d135341f0800e3d415312ae8.gif
      MessageBox.Show("Hello, Avalon");
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_105a1e124122b2abcee4ea8e9f5108f3.gif  }

img_05dd8d549cff04457a6366b0a7c9352a.gif}

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文件。

img_a6339ee3e57d1d52bc7d02b338e15a60.gif Example  1 - 3 . A minimal msbuild project file
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
<!--  1st.csproj  -->
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
< Project
img_a6339ee3e57d1d52bc7d02b338e15a60.gif  DefaultTargets
= " Build "
img_a6339ee3e57d1d52bc7d02b338e15a60.gif  xmlns
= " http://schemas.microsoft.com/developer/msbuild 
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
/ 2003 " >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
   < PropertyGroup >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< OutputType > winexe </ OutputType >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< OutputPath > .\ </ OutputPath >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< Assembly > 1st.exe </ Assembly >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif  
</ PropertyGroup >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif  
< ItemGroup >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< Compile Include = " MyApp.cs "   />
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< Reference Include = " System "   />
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< Reference Include = " WindowsBase "   />
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< Reference Include = " PresentationCore "   />
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< Reference Include = " PresentationFramework "   />
img_a6339ee3e57d1d52bc7d02b338e15a60.gif  
</ ItemGroup >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif  
< Import Project = " $(MsbuildBinPath)\Microsoft.CSharp.targets "   />
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
</ Project > img_a6339ee3e57d1d52bc7d02b338e15a60.gif

1。就是把*.csproj 工程文件用记事本打开看到的东西啦。相应命令行msbuild。总之,是vs2005所原有的。
2。倒数第二行有点意思,查了一下别人的blog,

Microsoft.CSharp.targets位于C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录下
用记事本打开,是一个XML文件,记录了生成项目的所有步骤。

img_a6339ee3e57d1d52bc7d02b338e15a60.gif Example  1 - 5 . A less minimal WPF application
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
//  MyApp.cs
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System.Windows;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
namespace  MyFirstAvalonApp  img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
class MyApp : Application img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif    [STAThread]
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
static void Main(string[] args) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif      MyApp app 
= new MyApp(  );
img_33d02437d135341f0800e3d415312ae8.gif      app.StartingUp 
+= app.AppStartingUp;
img_33d02437d135341f0800e3d415312ae8.gif      app.Run(args);
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif    
void AppStartingUp(object sender, StartingUpCancelEventArgs 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif e) 
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif      
// By default, when all top level windows
img_33d02437d135341f0800e3d415312ae8.gif      
// are closed, the app shuts down
img_33d02437d135341f0800e3d415312ae8.gif
      Window window = new Window(  );
img_33d02437d135341f0800e3d415312ae8.gif      window.Text 
= "Hello, Avalon";
img_33d02437d135341f0800e3d415312ae8.gif      window.Show(  );
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_105a1e124122b2abcee4ea8e9f5108f3.gif  }

img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_a6339ee3e57d1d52bc7d02b338e15a60.gif

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语法见后。

img_a6339ee3e57d1d52bc7d02b338e15a60.gif Example  1 - 6 . Window  class  declaring its own controls
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
//  Window1.cs
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System.Windows;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System.Windows.Controls;  //  Button et al
img_a6339ee3e57d1d52bc7d02b338e15a60.gif

img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
namespace  MyFirstAvalonApp  img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
class Window1 : Window img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
public Window1(  ) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif      
this.Text = "Hello, Avalon";
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif      
// Do something interesting (sortaimg_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif)
img_33d02437d135341f0800e3d415312ae8.gif
      Button button = new Button(  );
img_33d02437d135341f0800e3d415312ae8.gif      button.Content 
= "Click me, baby, one more time!";
img_33d02437d135341f0800e3d415312ae8.gif      button.Width 
= 200;
img_33d02437d135341f0800e3d415312ae8.gif      button.Height 
= 25;
img_33d02437d135341f0800e3d415312ae8.gif      button.Click 
+= button_Click;
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif      
this.AddChild(button);
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_33d02437d135341f0800e3d415312ae8.gif
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
void button_Click(object sender, RoutedEventArgs e) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif      MessageBox.Show(
img_33d02437d135341f0800e3d415312ae8.gif        
"You've done that before, haven't youimg_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif",
img_33d02437d135341f0800e3d415312ae8.gif        
"Nice!");
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_105a1e124122b2abcee4ea8e9f5108f3.gif  }

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上开发的例子——这样就对了。

目录
相关文章
|
C#
wpf之3d基础
原文:wpf之3d基础     关于3D方面的东西,本人只是浅尝辄止,从未曾在项目中使用过,相信有不少人也是基于一份兴趣去学习。这里将展示几个基本的WPF 3D编程,希望对初学者有一定帮助。     为帮助理解,这里全部使用C#代码构造,而不是写在XAML中,有兴趣的可以在这里下载源代码。
1072 0
|
C# 索引
#WPF的3D开发技术基础梳理
原文:#WPF的3D开发技术基础梳理 自学WPF已经有半年有余了,一遍用,一边学。但是一直没有去触摸WPF的3D开发相关技术,因为总觉得在内心是一座大山,觉得自己没有能力去逾越。
1362 0
|
测试技术 C#
[Songqw.Net 基础]WPF实现简单的插件化开发
原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/article/details/50895733 ...
1222 0
[Songqw.Net 基础]WPF插件化中同步Style
原文:[Songqw.Net 基础]WPF插件化中同步Style 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/article/details/50910590 ...
830 0
|
C# .NET 开发框架
WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新
原文:WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新 1、xmlns Mapping URI的格式是 clr-namespace:[;assembly=] (1)如果自定义类和XAML处在同一个Assembly之中,只还需要提供clr-namespace值。
1449 0