WPF编程宝典
第一章: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
?
總結
- 上一篇: c++反汇编与逆向分析
- 下一篇: c与c++遗漏点