第一章:WPF概述 WPF底层的图形技术不再是GDI/GDI++,而是DirectX. 对于特定服务,WPF仍依赖于user32,例如,处理和路由输入信息以及区分哪个应用程序实际拥有屏幕的哪 一部分,但是,所有绘图操作老师由DirectX完成。 Silverlight使用WPF平台的一个子集,通过一个插件可以把它驻留于任何现代浏览器中,并且对其他OS开放。 WPF多层体系结构,在顶层应用程序和一个完全由托管的c#代码编写的一组高层服务进行交互,至于将.NET对象 转换为Direct3D由后台milcore.dll的低级非托管组件完成。
在windows窗体编程中,窗体中的所有可视化内容都被称为控件,在WPF中,不再如此,可视化内容被称为元素(element),只有部分元素是控件。
第二章:XAML
第三章:布局 窗口布局原则:不应显式设定元素的尺寸;不应使用屏幕坐标指定元素的位置;布局容器和它们的子元素“共享”可以使用的空间; 可以嵌套布局容器。 System.Windows.Controls.Panel: 派生所有WPF布局容器 StackPanel WrapPanel DockPanel 根据容器的整个边界调整元素 Grid 根据一个不可见的表格在行和列中安排元素。这是最灵活最常用的容器之一。 UniformGrid Canvas Border 控件不是一个布局面板,而是元素,它只能包含一段嵌套内容(通常是布局面板),并且为其添加背景或在其周围添加边框。 <Button Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="3">Top Left</Button> RowSpan告诉button占用3行
Canvas面板适用需要构建其他一些不同的内容,绘图表面,Canvas.ZIndex附加属性来控制它们的层叠方式。 <Canvas ClipToBounds="True">其中ClipToBounds Canvas会裁剪溢出控件内容
第四章:依赖项属性 public static readonly DependencyProperty MarginProperty; 根据约定,定义依赖项属性的字段的名称为在普通属性的末尾加上单词“Property".//DependencyProperty 类名 DependencyProperty只能使用静态的DependencyProperty.Register()实例DependencyProperty对象 第五章:路由事件 WPF通过事件路由的概念增强了.NET事件模型。 public static readonly RoutedEvent ClickEvent; EventMangager.RegisterRoutedEvnet()方法注册。 路由事件通过普通的.NET事件进行包装,从而使所有的.NET语言都能够访问它们。事件包装器可以使用AddHandler(), RemoveHandler()方法添加和删除已注册的调用程序。 RoutedEventArgs e = new RoutedEventArgs(ButtonBase.ClickEvent,this); base.RaiseEvent(e); 路由事件实际上以下列三种方式出现: 1.Direct event 如:MouseEnter事件,源于一个元素,并且不传递给其他元素。 2.Bubbling event. MouseDown 3.Tunneling event 隧道路由事件,在事件到达恰当的控件之前为预览事件提供了机会,与冒泡事件方向相反,并以Preview开头 RoutdEventArgs类的属性 Source 事件源控件 RoutedEvent 通过事件处理程序为触发的事件提供RoutedEvent对象,如果使用同一个事件处理程序处理不同的事件,这信息是非常有用的。 Handled 该属性允许终止事件的冒泡或剖隧道过程。 <StackPanel Button.Click="DoSomething" Margin="5"> <Button Name="cmd1">Command 1</Button> <Button Name="cmd2">Command 2</Button> <Button Name="cmd3">Command 3</Button> ... </StackPanel> pnlButtons.AddHandler(Button.Click, new RoutedEventHandler(DoSomething));
PreviewMouseUp事件 隧道事件 MouseUp事件 冒泡事件 如果将隧道跌幅事件标记为已处理过,那么冒泡路由事件就不会发生,这是因为两个事件共享同一个RoutedEventArgs类的实例。 事件分类5类: 生命周期事件: Initialized/Loaded/Unloaded/Activated/Deactivated/Closing/Closed 鼠标事件: 键盘事件: PreviewKeyDown/keyDown/PreviewTextInput/TextInput/PreviewKeyUp/KeyUp 手写笔事件: 多点触控事件: ..................
第23章:窗口 Window类: Show(),ShowDialog() ShowDialog()显示模态窗口,锁住所有鼠标和键盘输入来阻止用户访问父窗口,直到模态窗口被关闭。 窗口所有权,当所有者窗口最小化时,被拥有的窗口也会被最小化,当相互重叠时,被拥有的窗口总是显示在上面。 DialogWindow dialog = new DialogWindow(); if(dialog.ShowDialog() == true) { DialogResult为true null是DialogResult初始值 检查其他属性以获取它所需的信息 } else { } WPF对话框模型相比Window窗口,WPF按钮没有提供DialogResult属性。 WPF手动移动窗口在任何时候都可以通过调用Window.DragMove()方法启动窗口拖动模式。 改变形状窗口的尺寸Window.ResizeMode设置为CanResizeWithGrip |