《WPF程序设计指南》读书笔记——第1章 应用程序与窗口
1.空白WPF项目的创建:
1)新建项目:在VS2010中,文件-新建-项目-visual c#-windows-空项目;
2)添加引用:PresentationFramework,PresentationCore,WindowsBase,System,System.Xaml,共5个。书中是4个,这是因为早期WindowsBase中的一些类后来放到了System.Xaml里。
3)添加文件:在项目中添加“新建项”,选择“代码文件"。
2.SayHello程序
using System;
using System.Windows; namespace LY.SayHello
{
class SayHello
{
[STAThread]
public static void Main()
{
Window win = new Window();
win.Title = "SayHello";
win.Show();
//Application app = new Application();
//app.Run();
}
}
}
1)注意Main首字母大写;
2)[STAThread]属性是为了和原来的COM兼容,表示单线程套间(Single Threaded Apartment,STA),如果没有,编译会失败;
3)在一个程序中只能有一个Application对象,也可以没有,如果注销最后两句代码,也可以运行,只不过Show出来的窗体是Modleless形态的,在屏幕一闪而过;如果把win.Show(),改为win.ShowDialog(),因为Modle窗体本身也有消息循环机制,窗体就可以一直存在。
4)”对程序的其他方面来说,Application对象就像固定的锚一般“,对这句话的理解:因为一般来说,Application.run()方法打开消息循环,决定了主程序的生存周期,其他窗体的运行都可以看成是在他限定的范围内运行,所以就像锚一般,将船固定在一个有限的范围内,而不能脱离这个范围。
3.简单的事件处理
using System;
using System.Windows;
using System.Windows.Input; namespace LY.HandleAnEvent
{
class HandleAnEvent
{
[STAThread]
public static void Main()
{
Application app = new Application();
Window win = new Window();
win.Title = "Handle An Event";
win.MouseDown += WindowsOnMouseDown;
app.Run(win);
}
static void WindowsOnMouseDown(object sender, MouseButtonEventArgs args)
{
//Window w = Application.Current.MainWindow;
Window win = sender as Window;
string strMessage = string.Format("windows click with {0} butten at point ({1})", args.ChangedButton, args.GetPosition(win));
MessageBox.Show(strMessage, win.Title);
}
}
}
1)通过委托,将WindowsOnMouseDown方法注册到MouseDown事件,MouseButtonEventArgs类定义在using System.Windows.Input命名空间中。
2)也可以通过Application.Current这个静态属性,取得所创建的Application对象,再通过Application.MainWindow这个实例属性,取得当前的主窗口。
4.重写Application类的事件的方法
using System;
using System.Windows;
using System.Windows.Input; namespace LY.InheritTheApp
{
class InheritTheApp:Application
{
[STAThread]
public static void Main()
{
InheritTheApp app = new InheritTheApp();
app.Run();
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Window win = new Window();
win.Title = "Inherit the App";
win.Show();
}
protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
{
base.OnSessionEnding(e);
MessageBoxResult result = MessageBox.Show("是否关闭窗口?", MainWindow.Title, MessageBoxButton.YesNoCancel, MessageBoxImage.Question, MessageBoxResult.Yes);
e.Cancel = (result == MessageBoxResult.Cancel);
}
}
}
1)可以通过重写(override)Application对象事件的方法,实现加入自定义行为的目的。比如上面的OnStartup、OnSessionEnding方法,从而在Application.Run()方法刚启动时,触发对应的StartupEventHandler委托类型的事件Application.Startup,进行一些初始化工作,在用户注销系统或关电脑的时候,触发对应的SessionEndingEventHandler委托类型的事件Application.SessionEnding,如上例中提示用户是否真的关闭。(在我机器上,仍然不能阻止机器直接注销或关机的行为,这可能和电脑本身的一些具体设置有关系。)
2)Application类还有很多属性、事件、方法,比如对光标所在位置,功能键按键的处理,可以重写OnKeyDown、OnKeyUp,对键盘输入用重写OnTextInput,参见http://www.cnblogs.com/leezhm/archive/2011/06/21/2086308.html
5.多个窗口之间的关系
using System;
using System.Windows;
using System.Windows.Input; namespace LY.ThorwWindowParty
{
class ThrowWindowParty:Application
{
[STAThread]
public static void Main()
{
ThrowWindowParty app = new ThrowWindowParty();
//app.ShutdownMode = ShutdownMode.OnMainWindowClose;
app.Run();
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Window winmain = new Window();
winmain.Title = "Main Window";
winmain.MouseDown+=WindowsOnMouseDown;
winmain.Show();
for (int i = 0; i < 2; i++)
{
Window win = new Window();
win.Title = "Extra Window No." + (i + 1);
win.Show();
//this.MainWindow = win;
win.Owner = winmain;
}
//this.ShutdownMode = ShutdownMode.OnMainWindowClose;
}
void WindowsOnMouseDown(object sender, MouseButtonEventArgs args)
{
Window win = new Window();
win.Title = "Model Dialog Box";
win.ShowDialog();
}
}
}
1)第一个被创建的窗口自动成为主窗口,可以用Application.MainWindow查看,也可以通过win.Owner指定一个窗口的父窗口;也可以用Application.Windows集合索引取得特定窗口,Windows.Count记录窗口总数。
2)默认情况下,主窗口或父窗口被关闭时,Application.Run()退出;Application.ShutdownMode属性可以指定Application.Run()的退出模式,其值为枚举,分别为ShutdownMode.OnMainWindowClose、OnLastWindowClose、OnExplicitShutdown,表示在主窗口关闭、最后一个窗口关闭、显式调用Application.Shutdown()方法时再关闭。
3)一般情况下,很少使用继承自Application类的子类,经常会使用继承自Window类的的子类,并通过子类的构造函数完成窗口的初始化工作。如下例:
6.WPF的设备无关单位(像素)特性
using System;
using System.Windows;
using System.Windows.Input; namespace LY.InheritTheWin
{
class InheritTheWin:Window
{
[STAThread]
public static void Main()
{
new Application().Run(new InheritTheWin());
}
public InheritTheWin()
{
Title = "Inherit The Win";
Width = 500;
Height = 400;
Left = 300;
Top = 300;
}
}
}
1)Width和Height属性用于设置对象大小尺寸(double值,因此可以有小数),但因为实际呈现的窗口大小是经过计算后的,依赖于系统屏幕设置,实际大小可以通过ActualWidth和ActualHeight取得。如果用户没有设置Width和Height属性,自然就没有这两个值,也就是NaN(not a number),但只要窗口呈现后,当然就会有ActualWidth和ActualHeight值。
2)没有right和bottom属性,想知道窗口右下角位置,可以通过left和top属性,以及窗口自身的长宽推算出来。此外,通过System.Windows命名空间下的SystemParameters类,可以得到很多系统参数,比如屏幕大小。
3)关于设备无关单位的进一步认识,参见:http://www.cnblogs.com/wangshuai/archive/2010/05/12/1733627.html
4)Window类的很多属性可以控制窗口外观和行为,比如WindowStyle、WindowStartupLocation、ResizeMode、WindowState、Topmost、Background等等。
《WPF程序设计指南》读书笔记——第1章 应用程序与窗口的更多相关文章
- css权威指南读书笔记-第10章浮动和定位
这一章看了之后真是豁然开朗,之前虽然写了圣杯布局和双飞翼布局,有些地方也是模糊的,现在打算总结之后再写一遍. 以下都是从<css权威指南>中摘抄的我认为很有用的说明. 浮动元素 一个元素浮 ...
- 《Javascript高级程序设计》读书笔记(1-3章)
第一章 JavaScript简介 1.1 JavaScript简史 略 1.2 JavaScript实现 虽然 JavaScript 和 ECMAScript 通常都被人们用来表达相同的含义,但 Ja ...
- JavaScript权威指南读书笔记【第一章】
第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自J ...
- 《JavaScript高级程序设计》 - 读书笔记 - 第5章 引用类型
5.1 Object 类型 对象是引用类型的实例.引用类型是一种数据结构,用于将数据和功能组织在一起. 新对象是使用new操作符后跟一个构造函数来创建的.构造函数本身就是一个函数,只不过该函数是出于创 ...
- 《JavaScript高级程序设计》 - 读书笔记 - 第4章 变量、作用域和内存问题
4.1 基本类型和引用类型的值 JavaScript变量是松散类型的,它只是保存特定值的一个名字而已. ECMAScript变量包含两种数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据 ...
- 《Linux程序设计》--读书笔记---第十三章进程间通信:管道
管道:进程可以通过它交换更有用的数据. 我们通常是把一个进程的输出通过管道连接到另一个进程的输入: 对shell命令来说,命令的连接是通过管道字符来完成的: cmd1 | cmd2 sh ...
- 《Visual C++ 程序设计》读书笔记 ----第8章 指针和引用
1.&取地址:*取内容. 2.指针变量“++”“--”,并不是指针变量的值加1或减1,而是使指针变量指向下一个或者上一个元素. 3.指针运算符*与&的优先级相同,左结合:++,--,* ...
- 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度
<Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...
- 《Linux内核设计与分析》第六周读书笔记——第三章
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
随机推荐
- android开发之路08(ListView&Adapter)
ListView控件介绍:用于将数据库中的数据或者网络中的数据通过列表的形式显示出来:ListView采用MVC模式将前端显示和后端数据进行分离. 也就是说,ListView控件在装载数据时并不是直接 ...
- Android中IntentService的原理及使用
在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功.那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线 ...
- HttpClient(4.3.5) - HTTP Protocol Interceptors
The HTTP protocol interceptor is a routine that implements a specific aspect of the HTTP protocol. U ...
- 和阿文一起学H5--设计稿尺寸全攻略
- 和阿文一起学H5——音乐素材
国内 1.网易云音乐 http://music.163.com/ 网易云音乐有听歌识曲功能,听几秒中可听出是什么歌. 微信摇一摇也有听歌识曲功能. 2.只要伴奏不要人声 http://5sing.ku ...
- SQL_从星期一到星期六自动打卡SQL代码
create proc sp_MarkAutoKQ as begin ) ---创建两个变量,接收当前时间和当天是星期几 set @dateA=getdate() ---获取当前时间 set @dat ...
- Excel Operation
在日常工作中, 常常需要收集统计一些数据, 然后整理到excel, 这种重复性的操作可以自己写个工具来实现. 采用HtmlUnitDriver 访问页面, 抓取数据, 再把数据列表通过调用POI放到e ...
- button上加上图片的两种方式
//// ViewController.m// UIButtonDemo//// Created by hehe on 15/9/15.// Copyright (c) 2015年 wang. ...
- C#学习笔记之线程 - 使用线程
基于事件的异步模式 (EAP -- The Event-Based Asynchronous Pattern) EAP提供了一个简单的办法,通过它的类能够提供多线程能力,而不需显式的开启或管理线程.它 ...
- UML建模文章总结
一.为什么要学习UML UML是Unified Modeling Language(统一建模语言)的简称.UML是对软件密集型系统中的制品进行可视化.详述.构造和文档化的语言.制品{Artifact} ...