一、运行程序的过程:
- (1) Application 对象被构造出来。
- (2)Run方法被调用。
- (3)Application.Startup 事件被触发
- (4)用户代码构造一个或多个 Window 对象。
- (5)Application.Shutdow 方法被调用。
- (6)Application.Exit 事件被触发。
- (7)Run 方法完成执行。
初始化应用程序有两种方法:
从 Application 对象的构造器中初始化应用程序,或者处理 Startup 事件通常更好,因为 Application 在这里才完成它的内部初始化(例如,Application.Current 不会在构造器中进行设置)。
二、错误处理
针对无法恢复的异常问题
StackOverflowException:堆栈溢出大部分是由于代码进入的是死循环。
OutofMemoryException:当系统运行于低内存的时候,如此少的可用资源以至于 CLR 都不能多分配一个字节了。在这样的情况下,没有任何代码能被即时编译,没有任何变量能被装箱,也没有任何对象能被分配。
ThreadAbortException:线程只有当应用程序代码调用 Thread.Abort 时才会终止,所以如果不调用 Thread.Abort,甚至都不会看到 ThreadAbortException 出现。
DispartcherUnhandledException
当无法使用任何代码来处理异常时,处理冒泡到应用程序上的异常;
<!--MyApp.xaml-->
<Application ... DispatcherUnhandledException='Failure' />
//MyApp.xaml.cs
void Failure(object sender,DispatcheUnhandledExceptionEventArgs e){
// your custom logic
}
public class DispatcheUnhandledExceptionEventArgs
:DispatcherEventArgs{
public Wxception Excetion {get;}
public bool Handled {get;set;};
}
三、窗口
窗口的生命周期的主要阶段:
- (1)Window.Initalized 事件被触发;
- (2)Window.Actived 事件被触发;
- (3)Window.Loaded 事件被触发;
- (4)Window.ContentRendered 事件被触发;
- (5)Window.CotentRendered 事件被触发;
- (6)用户和窗口进行交互;
- (7)Window.Closing 事件被触发;
- (8)Window.Unloaded 事件被触发;
- (9)Window.Closed 事件被触发;
四、导航和页面
三个概念:导航宿主、导航内容、日志(负责跟踪应用程序的导航动作)
导航宿主:NavigationWindow 是WPF 中默认的导航宿主。NavigationWindow 继承自 Window 并添加了一个默认的导航 UI(回退按钮等)。以及一些实现导航的必需基础功能。NavigationWindow 可以如 Window 那样访问所有应用程序级的特性。利用 NavigationWindow,可以实现 SDI 导航窗口模型。它能托管导航内容;
导航内容:如数据对象,如字符串这样的基本类型或页面。
public class NavExample: NavigationWindow{
public NavExample(){
Mavigate(new Page1());//导航内容
}
}
public class Page1:Page{
public Page1(){
TextBlock block = new TextBlock();
Hyperlink link = new Hyperlink();
link.Click += LinkClicked;
link.Inlines.Add("Click for page 2");
block.Inlines.Add(link);
Content = block;
WindowTitle = "Page 1";
}
void LinkClicked(object sender,RoutedEventArgs e){
NavigationService.Navigate(new Page2());
}
}
NavigationService 对象提供了宿主独立的导航操作的访问能力。NavigationService 将能正常处理导航操作,而不管页面是被托管在浏览器中还是在 NavigationWindow 中;
日志: 跟踪所有东西。
备注:
历史(History): 所访问站点的一个固定列表,是一种以时间为基础的自动书签列表;
日志(Journal): 在当前会话中所访问站点的列表。
使用xaml实现导航:
<!--page1.xaml-->
<page WindowTitle ='Page 1'>
<TextBlock>
<Hyperlink NavigateUri='page2.xaml'>
Click for page 2
</Hyperlink>
</TextBlock>
</page>
<!--page2.xaml-->
<Page WindowTitle='Page 2'>
</page>
<!--navexample.xaml-->
<NavigationWindow x:Class='EssentialWPF.NavExample' Source='page1.xaml'>
</NavigationWindow>
NavigationWindow 的 Source 属性能被设置为第一个页面的 URI 名称(Page1.xaml),这样
启动页面
<!--app.xaml-->
<Application x:Class='EssentialWPF.App' StartupUri='page1.xaml'>
</Application>
在页面之间传递状态
在HTML中,通过在服务器上保存状态来传递数据,或者利用客户端的 Cookie 来完成数据传递。在 WPF 中传递数据的一个简单的方式就是利用 Application 的 Properties 字典。