內容簡介
WPF提供瞭為Windows操作係統構建高品質用戶界麵的開發框架,融閤瞭源於多個渠道的豐富內容,為您充分利用Windows計算機的處理能力提供瞭前所未有的機會。
《.NET開發經典名著·WPF編程寶典:使用C# 2012和.NET 4.5(第4版)》全麵講解WPF的實際工作原理,是一本WPF專業著作。在緊貼實用示例這一思想的引導下,列齣實用提示,引導以專業的方式使用WPF。《.NET開發經典名著·WPF編程寶典:使用C# 2012和.NET 4.5(第4版)》開篇介紹WPF基本概念以便為您奠定堅實的基礎,並將現有C#技能作為引用框架,然後討論高級概念,結閤實際演示它們的用法,並重點強調瞭可由此節省的時間和人力成本。
主要內容:
·理解WPF編程的基礎知識:從XAML到控件,乃至數據流;
·開發實用的應用程序,帶您實際瞭解導航、本地化和開發;
·探討WPF提供的高級用戶界麵控件;
·分析如何在WPF中管理文檔,涵蓋瞭文本布局、打印和文檔打包等所有技術;
·使用圖形和多媒體來增強應用程序。
作者簡介
麥剋唐納(MatthewMacDonald),是一位作傢、教育傢,也是微軟最有價值專傢。他撰寫瞭十多本有關.NET編程的書籍,包括ProSilverlight3inC#(2009年Apress齣版)和ProASP.NET3.5inC#(2007年Apress齣版)以及本書的前一版本。目前他與妻子以及兩個女兒居住在多倫多。
內頁插圖
目錄
第Ⅰ部分 基礎知識
第1章 WPF概述
1.1 Windows圖形演化
1.1.1 DirectX:新的圖形引擎
1.1.2 硬件加速與WPF
1.2 WPF:高級API
1.3 分辨率無關性
1.3.1 WPF單位
1.3.2 係統DPI
1.3.3 位圖和矢量圖形
1.4 WPF體係結構
1.5 WPF 4.5
1.5.1 WPF工具包
1.5.2 Visual Studio 2012
1.6 小結
第2章 XAML
2.1 理解XAML
2.1.1 WPF之前的圖形用戶界麵
2.1.2 XAML變體
2.1.3 XAML編譯
2.2 XAML基礎
2.2.1 XAML名稱空間
2.2.2 代碼隱藏類
2.3 XAML中的屬性和事件
2.3.1 簡單屬性與類型轉換器
2.3.2 復雜屬性
2.3.3 標記擴展
2.3.4 附加屬性
2.3.5 嵌套元素
2.3.6 特殊字符與空白
2.3.7 事件
2.3.8 完整的Eight Ball Answer示例
2.4 使用其他名稱空間中的類型
2.5 加載和編譯XAML
2.5.1 隻使用代碼
2.5.2 使用代碼和未經編譯的XAML
2.5.3 使用代碼和編譯過的XAML
2.5.4 隻使用XAML
2.6 小結
第3章 布局
3.1 理解WPF中的布局
3.1.1 WPF布局原則
3.1.2 布局過程
3.1.3 布局容器
3.2 使用StackPanel麵闆進行簡單布局
3.2.1 布局屬性
3.2.2 對齊方式
3.2.3 邊距
3.2.4 最小尺寸、最大尺寸以及顯式地設置尺寸
3.2.5 Border控件
3.3 WrapPanel和DockPanel麵闆
3.3.1 WrapPanel麵闆
3.3.2 DockPanel麵闆
3.3.3 嵌套布局容器
3.4 Grid麵闆
3.4.1 調整行和列
3.4.2 布局捨入
3.4.3 跨越行和列
3.4.4 分割窗口
3.4.5 共享尺寸組
3.4.6 UniformGrid麵闆
3.5 使用Canvas麵闆進行基於坐標的布局
3.5.1 Z順序
3.5.2 lnkCanvas元素
3.6 布局示例
3.6.1 列設置
3.6.2 動態內容
3.6.3 組閤式用戶界麵
3.7 小結
第4章 依賴項屬性
4.1 理解依賴項屬性
4.1.1 定義依賴項屬性
4.1.2 注冊依賴項屬性
4.1.3 添加屬性包裝器
4.1.4 WPF使用依賴項屬性的方式
4.1.5 共享的依賴項屬性
4.1.6 附加的依賴項屬性
4.2 屬性驗證
4.2.1 驗證迴調
4.2.2 強製迴調
4.3 小結
第5章 路由事件
5.1 理解路由事件
5.1.1 定義、注冊和封裝路由事件
5.1.2 共享路由事件
5.1.3 引發路由事件
5.1.4 處理路由事件
5.2 事件路由
5.2.1 RoutedEventArgs類
5.2.2 冒泡路由事件
5.2.3 處理掛起的事件
5.2.4 附加事件
5.2.5 隧道路由事件
5.3 WPF事件
5.3.1 生命周期事件
5.3.2 輸入事件
5.4 鍵盤輸入
5.4.1 處理按鍵事件
5.4.2 焦點
5.4.3 獲取鍵盤狀態
5.5 鼠標輸入
5.5.1 鼠標單擊
5.5.2 捕獲鼠標
5.5.3 鼠標拖放
5.6 多點觸控輸入
5.6.1 多點觸控的輸入層次
5.6.2 原始觸控
5.6.3 操作
5.6.4 慣性
5.7 小結
第Ⅱ部分 進一步研究WPF
第6章 控件
6.1 控件類
6.1.1 背景畫刷和前景畫刷
6.1.2 字體
6.1.3 鼠標光標
6.2 內容控件
6.2.1 Content屬性
6.2.2 對齊內容
6.2.3 WPF內容原則
6.2.4 標簽
6.2.5 按鈕
6.2.6 工具提示
6.3 特殊容器
6.3.1 ScrollViewer
6.3.2 GroupBox
6.3.3 TabItem
6.3.4 Expander
6.4 文本控件
6.4.1 多行文本
6.4.2 選擇文本
6.4.3 拼寫檢查
6.4.4 PasswordBox
6.5 列錶控件
6.5.1 ListBox
6.5.2 ComboBox
6.6 基於範圍的控件
6.6.1 Slider
6.6.2 ProgressBar
6.7 日期控件
6.8 小結
第7章 Application類
7.1 應用程序的生命周期
7.1.1 創建Application對象
7.1.2 派生自定義的Application類
7.1.3 應用程序的關閉方式
7.1.4 應用程序事件
7.2 Application類的任務
7.2.1 顯示初始界麵
7.2.2 處理命令行參數
7.2.3 訪問當前Application對象
7.2.4 在窗口之間進行交互
7.2.5 單實例應用程序
7.3 程序集資源
7.3.1 添加資源
7.3.2 檢索資源
7.3.3 pack URI
7.3.4 內容文件
7.4 本地化
7.4.1 構建能夠本地化的用戶界麵
7.4.2 使應用程序為本地化做好準備
7.4.3 管理翻譯過程
7.5 小結
第8章 元素綁定
8.1 將元素綁定到一起
8.1.1 綁定錶達式
8.1.2 綁定錯誤
8.1.3 綁定模式
8.1.4 使用代碼創建綁定
8.1.5 使用代碼檢索綁定
8.1.6 多綁定
8.1.7 綁定更新
8.1.8 綁定延遲
8.2 綁定到非元素對象
8.2.1 Source屬性
8.2.2 RelativeSource屬性
8.2.3 DataContext屬性
8.3 小結
第9章 命令
9.1 理解命令
9.2 WPF命令模型
9.2.1 ICommand接口
9.2.2 RoutedCommand類
9.2.3 RoutedUICommand類
9.2.4 命令庫
9.3 執行命令
9.3.1 命令源
9.3.2 命令綁定
9.3.3 使用多命令源
9.3.4 微調命令文本
9.3.5 直接調用命令
9.3.6 禁用命令
9.3.7 具有內置命令的控件
9.4 高級命令
9.4.1 自定義命令
9.4.2 在不同位置使用相同的命令
9.4.3 使用命令參數
9.4.4 跟蹤和翻轉命令
9.5 小結
第10章 資源
10.1 資源基礎
10.1.1 資源集閤
10.1.2 資源的層次
10.1.3 靜態資源和動態資源
10.1.4 非共享資源
10.1.5 通過代碼訪問資源
10.1.6 應用程序資源
10.1.7 係統資源
10.2 資源字典
10.2.1 創建資源字典
10.2.2 使用資源字典
10.2.3 在程序集之間共享資源
10.3 小結
第11章 樣式和行為
11.1 樣式基礎
11.1.1 創建樣式對象
11.1.2 設置屬性
11.1.3 關聯事件處理程序
11.1.4 多層樣式
11.1.5 通過類型自動應用樣式
11.2 觸發器
11.2.1 簡單觸發器
11.2.2 事件觸發器
11.3 行為
11.3.1 獲取行為支持
11.3.2 理解行為模型
11.3.3 創建行為
11.3.4 使用行為
11.3.5 Blend中的設計時行為支持
11.4 小結
第Ⅲ部分 圖畫和動畫
第12章 形狀、畫刷和變換
12.1 理解形狀
12.1.1 Shape類
12.1.2 矩形和橢圓
12.1.3 改變形狀的尺寸和放置形狀
12.1.4 使用Viewbox控件縮放形狀
12.1.5 直綫
12.1.6 摺綫
12.1.7 多邊形
12.1.8 直綫綫帽和直綫交點
12.1.9 點劃綫
12.1.10 像素對齊
12.2 畫刷
12.2.1 SolidColorBrush畫刷
12.2.2 LinearGradientBrush畫刷
12.2.3 RadialGradientBrush畫刷
12.2.4 ImageBrush畫刷
12.2.5 平鋪的ImageBrush畫刷
12.2.6 VisualBrush畫刷
12.2.7 BitmapCacheBrush畫刷
12.3 變換
12.3.1 變換形狀
12.3.2 變換元素
12.4 透明
12.4.1 使元素半透明
12.4.2 透明掩碼
12.5 小結
第13章 幾何圖形和圖畫
13.1 路徑和幾何圖形
13.1.1 直綫、矩形和橢圓圖形
13.1.2 使用GeometryGroup組閤形狀
13.1.3 使用CombinedGeometry融閤幾何圖形
13.1.4 使用PathGeometry繪製麯綫和直綫
13.1.5 微語言幾何圖形
13.1.6 使用幾何圖形進行剪裁
13.2 圖畫
13.2.1 顯示圖畫
13.2.2 導齣插圖
13.3 小結
第14章 效果和可視化對象
14.1 可視化對象
14.1.1 繪製可視化對象
14.1.2 在元素中封裝可視化對象
14.1.3 命中測試
14.1.4 復雜的命中測試
14.2 效果
14.2.1 BlurEffect類
14.2.2 DropShadowEffect類
14.2.3 ShaderEffect類
14.3 WriteableBitmap類
14.3.1 生成位圖
14.3.2 寫入WriteableBitmap對象
14.3.3 更高效的像素寫入
14.4 小結
第15章 動畫基礎
15.1 理解WPF動畫
15.1.1 基於時間的動畫
15.1.2 基於屬性的動畫
15.2 基本動畫
15.2.1 Animation類
15.2.2 使用代碼創建動畫
15.2.3 同時發生的動畫
15.2.4 動畫的生命周期
15.2.5 Timeline類
15.3 故事闆
15.3.1 故事闆
15.3.2 事件觸發器
15.3.3 重疊動畫
15.3.4 同步的動畫
15.3.5 控製播放
15.3.6 監視動畫進度
15.4 動畫緩動
15.4.1 使用緩動函數
15.4.2 在動畫開始時應用緩動與在動畫結束時應用緩動
15.4.3 緩動函數類
15.4.4 創建自定義緩動函數
15.5 動畫性能
15.5.1 期望的幀率
15.5.2 位圖緩存
15.6 小結
第16章 高級動畫
16.1 動畫類型迴顧
16.1.1 動態變換
16.1.2 動態改變畫刷
16.1.3 動態改變像素著色器
16.2 關鍵幀動畫
16.2.1 離散的關鍵幀動畫
16.2.2 緩動關鍵幀
16.2.3 樣條關鍵幀動畫
16.3 基於路徑的動畫
16.4 基於幀的動畫
16.5 使用代碼創建故事闆
16.5.1 創建主窗口
16.5.2 創建Bomb用戶控件
16.5.3 投彈
16.5.4 攔截炸彈
16.5.5 統計炸彈和清理工作
16.6 小結
第Ⅳ部分 模闆和自定義元素
第17章 控件模闆
17.1 理解邏輯樹和可視化樹
17.2 理解模闆
17.2.1 修飾類
17.2.2 剖析控件
17.3 創建控件模闆
17.3.1 簡單按鈕
17.3.2 模闆綁定
17.3.3 改變屬性的觸發器
17.3.4 使用動畫的觸發器
17.4 組織模闆資源
17.4.1 分解按鈕控件模闆
17.4.2 通過樣式應用模闆
17.4.3 自動應用模闆
17.4.4 由用戶選擇的皮膚
17.5 構建更復雜的模闆
17.5.1 嵌套的模闆
17.5.2 修改滾動條
17.5.3 控件模闆示例
17.6 可視化狀態
17.7 小結
第18章 自定義元素
18.1 理解WPF中的自定義元素
18.2 構建基本的用戶控件
18.2.1 定義依賴項屬性
18.2.2 定義路由事件
18.2.3 添加標記
18.2.4 使用控件
18.2.5 命令支持
18.2.6 深入分析用戶控件
18.3 創建無外觀控件
18.3.1 修改顔色拾取器的代碼
18.3.2 修改顔色拾取器的標記
18.3.3 精簡控件模闆
18.4 支持可視化狀態
18.4.1 開始編寫FlipPanel類
18.4.2 選擇部件和狀態
18.4.3 默認控件模闆
18.4.4 使用FlipPanel控件
18.4.5 使用不同的控件模闆
18.5 創建自定義麵闆
18.5.1 兩步布局過程
18.5.2 Canvas麵闆的副本
18.5.3 更好的WrapPanel麵闆
18.6 自定義繪圖元素
18.6.1 OnRender( )方法
18.6.2 評估自定義繪圖
18.6.3 自定義繪圖元素
18.6.4 創建自定義裝飾元素
18.7 小結
第Ⅴ部分 數據
第19章 數據綁定
19.1 使用自定義對象綁定到數據庫
19.1.1 構建數據訪問組件
19.1.2 構建數據對象
19.1.3 顯示綁定對象
19.1.4 更新數據庫
19.1.5 更改通知
19.2 綁定到對象集閤
19.2.1 顯示和編輯集閤項
19.2.2 插入和移除集閤項
19.2.3 綁定到ADO.NET對象
19.2.4 綁定到LINQ錶達式
19.3 提高大列錶的性能
19.3.1 虛擬化
19.3.2 項容器再循環
19.3.3 緩存長度
19.3.4 延遲滾動
19.4 驗證
19.4.1 在數據對象中進行驗證
19.4.2 自定義驗證規則
19.4.3 響應驗證錯誤
19.4.4 獲取錯誤列錶
19.4.5 顯示不同的錯誤指示符號
19.4.6 驗證多個值
19.5 數據提供者
19.5.1 ObjectDataProvider
19.5.2 XmlDataProvider
19.6 小結
第20章 格式化綁定的數據
20.1 數據綁定迴顧
20.2 數據轉換
20.2.1 使用StringFormat屬性
20.2.2 值轉換器簡介
20.2.3 使用值轉換器設置字符串的格式
20.2.4 使用值轉換器創建對象
20.2.5 應用條件格式化
20.2.6 評估多個屬性
20.3 列錶控件
20.4 列錶樣式
20.4.1 ItemContainerStyle
20.4.2 包含復選框或單選按鈕的ListBox控件
20.4.3 交替條目樣式
20.4.4 樣式選擇器
20.5 數據模闆
20.5.1 分離和重用模闆
20.5.2 使用更高級的模闆
20.5.3 改變模闆
20.5.4 模闆選擇器
20.5.5 模闆與選擇
20.5.6 改變項的布局
20.6 ComboBox控件
20.7 小結
第21章 數據視圖
21.1 View對象
21.1.1 檢索視圖對象
21.1.2 視圖導航
21.1.3 以聲明方式創建視圖
21.2 過濾、排序與分組
21.2.1 過濾集閤
21.2.2 過濾DataTable對象
21.2.3 排序
21.2.4 分組
21.2.5 實時成型
21.3 小結
第22章 列錶、樹和網格
22.1 ListView控件
22.1.1 使用GirdView創建列
22.1.2 創建自定義視圖
22.2 TreeView控件
22.2.1 創建數據綁定的TreeView控件
22.2.2 將DataSet對象綁定到TreeView控件
22.2.3 即時創建節點
22.3 DataGrid控件
22.3.1 改變列的尺寸與重新安排列
22.3.2 定義列
22.3.3 設置列的格式和樣式
22.3.4 設置行的格式
22.3.5 顯示行細節
22.3.6 凍結列
22.3.7 選擇
22.3.8 排序
22.3.9 編輯
22.4 小結
第Ⅵ 窗口、頁麵和富控件
第23章 窗口
23.1 Window類
23.1.1 顯示窗口
23.1.2 定位窗口
23.1.3 保存和還原窗口位置
23.2 窗口交互
23.2.1 窗口所有權
23.2.2 對話框模型
23.2.3 通用對話框
23.3 非矩形窗口
23.3.1 簡單形狀窗口
23.3.2 具有形狀內容的透明窗口
23.3.3 移動形狀窗口
23.3.4 改變形狀窗口的尺寸
23.3.5 組閤到一起:窗口的自定義控件模闆
23.4 Windows 7任務欄編程
23.4.1 使用跳轉列錶
23.4.2 改變任務欄圖標和預覽
23.5 小結
第24章 頁麵和導航
24.1 基於頁麵的導航
24.2 基於頁麵的界麵
24.2.1 創建一個具有導航窗口的基於頁麵的簡單應用程序
24.2.2 Page類
24.2.3 超鏈接
24.2.4 在框架中駐留頁麵
24.2.5 在另一個頁麵中駐留頁麵
24.2.6 在Web瀏覽器中駐留頁麵
24.3 頁麵曆史
24.3.1 深入分析WPF中的URI
24.3.2 導航曆史
24.3.3 維護自定義的屬性
24.4 導航服務
24.4.1 通過編程進行導航
24.4.2 導航事件
24.4.3 管理日誌
24.4.4 嚮日誌添加自定義項
24.4.5 使用頁函數
24.5 XAML瀏覽器應用程序
24.5.1 創建XBAP應用程序
24.5.2 部署XBAP應用程序
24.5.3 更新XBAP應用程序
24.5.4 XBAP應用程序的安全性
24.5.5 完全信任的XBAP應用程序
24.5.6 組閤XBAP/獨立應用程序
24.5.7 為不同的安全級彆編寫代碼
24.5.8 在網頁中嵌入XBAP應用程序
24.6 WebBrowser控件
24.6.1 導航到頁麵
24.6.2 構建DOM樹
24.6.3 使用.NET代碼為網頁添加腳本
24.7 小結
第25章 菜單、工具欄和功能區
25.1 菜單
25.1.1 Menu類
25.1.2 菜單項
25.1.3 ContextMenu類
25.1.4 菜單分隔條
25.2 工具欄和狀態欄
25.2.1 ToolBar控件
25.2.2 StatusBar控件
25.3 功能區
25.3.1 添加功能區
25.3.2 應用程序菜單
25.3.3 選項卡、組與按鈕
25.3.4 富工具提示
25.3.5 帶有快捷鍵提示的鍵盤訪問
25.3.6 改變功能區的大小
25.3.7 快速訪問工具欄
25.4 小結
第26章 聲音和視頻
26.1 播放WAV音頻
26.1.1 SoundPlayer類
26.1.2 SoundPlayerAction類
26.1.3 係統聲音
26.2 MediaPlayer類
26.3 MediaElement類
26.3.1 使用代碼播放音頻
26.3.2 處理錯誤
26.3.3 使用觸發器播放音頻
26.3.4 播放多個聲音
26.3.5 改變音量、平衡、速度以及位置
26.3.6 將動畫同步到音頻
26.3.7 播放視頻
26.3.8 視頻效果
26.4 語音
26.4.1 語音閤成
26.4.2 語音識彆
26.5 小結
第27章 3D繪圖
27.1 3D繪圖基礎
27.1.1 視口
27.1.2 3D對象
27.1.3 攝像機
27.2 深入研究3D繪圖
27.2.1 著色和法綫
27.2.2 更復雜的形狀
27.2.3 Model3DGroup集閤
27.2.4 使用材質
27.2.5 紋理映射
27.3 交互和動畫
27.3.1 變換
27.3.2 鏇轉
27.3.3 飛過
27.3.4 跟蹤球
27.3.5 命中測試
27.3.6 3D錶麵上的2D元素
27.4 小結
第Ⅶ部分 文檔和打印
第28章 文檔
28.1 理解文檔
28.2 流文檔
28.2.1 流內容元素
28.2.2 設置內容元素的格式
28.2.3 創建簡單的流文檔
28.2.4 塊元素
28.2.5 內聯元素
28.2.6 通過代碼與元素進行交互
28.2.7 文本對齊
28.3 隻讀流文檔容器
28.3.1 縮放
28.3.2 創建頁麵和列
28.3.3 從文件加載文檔
28.3.4 打印
28.4 編輯流文檔
28.4.1 加載文件
28.4.2 保存文件
28.4.3 設置所選文本的格式
28.4.4 獲取單個單詞
28.5 固定文檔
28.6 批注
28.6.1 批注類
28.6.2 啓用批注服務
28.6.3 創建批注
28.6.4 檢查批注
28.6.5 響應批注更改
28.6.6 在固定文檔中保存批注
28.6.7 自定義便簽的外觀
28.7 小結
第29章 打印
29.1 基本打印
29.1.1 打印元素
29.1.2 變換打印輸齣
29.1.3 打印不顯示的元素
29.1.4 打印文檔
29.1.5 在文檔打印輸齣中控製頁麵
29.2 自定義打印
29.2.1 使用可視化層中的類進行打印
29.2.2 自定義多頁打印
29.3 打印設置和管理
29.3.1 保存打印設置
29.3.2 打印頁麵範圍
29.3.3 管理打印隊列
29.4 通過XPS進行打印
29.4.1 為打印預覽創建XPS文檔
29.4.2 寫入內存的XPS文檔
29.4.3 通過XPS直接打印到打印機
29.4.4 異步打印
29.5 小結
第Ⅷ部分 其他主題
第30章 與Windows窗體進行交互
30.1 訪問互操作性
30.2 混閤窗口和窗體
30.2.1 為WPF應用程序添加窗體
30.2.2 為Windows窗體應用程序添加WPF窗口
30.2.3 顯示模態窗口和窗體
30.2.4 顯示非模態窗口和窗體
30.2.5 啓用Windows窗體控件的可視化風格
30.3 創建具有混閤內容的窗口
30.3.1 WPF和Windows窗體“空域”
30.3.2 在WPF中駐留Windows窗體控件
30.3.3 使用WPF和Windows窗體用戶控件
30.3.4 在Windows窗體中駐留WPF控件
30.3.5 訪問鍵、助記碼和焦點
30.3.6 屬性映射
30.4 小結
第31章 多綫程
31.1 瞭解多綫程模型
31.1.1 Dispatcher類
31.1.2 DispatcherObject類
31.2 BackgroundWorker類
31.2.1 簡單的異步操作
31.2.2 創建BackgroundWorker對象
31.2.3 運行BackgroundWorker對象
31.2.4 跟蹤進度
31.2.5 支持取消
31.3 小結
第32章 插件模型
32.1 在MAF和MEF兩者間進行選擇
32.2 瞭解插件管道
32.2.1 管道的工作原理
32.2.2 插件文件夾結構
32.2.3 為使用插件模型準備解決方案
32.3 創建使用插件模型的應用程序
32.3.1 協定
32.3.2 插件視圖
32.3.3 插件
32.3.4 插件適配器
32.3.5 宿主視圖
32.3.6 宿主適配器
32.3.7 宿主
32.3.8 更多插件
32.4 與宿主進行交互
32.5 可視化插件
32.6 小結
第33章 ClickOnce部署
33.1 理解應用程序部署
33.1.1 ClickOnce安裝模型
33.1.2 ClickOnce部署的局限性
33.2 簡單的ClickOnce發布
33.2.1 設置發布者和産品
33.2.2 啓動發布嚮導
33.2.3 理解部署文件的結構
33.2.4 安裝ClickOnce應用程序
33.2.5 更新ClickOnce應用程序
33.3 ClickOnce附加選項
33.3.1 發布版本
33.3.2 更新
33.3.3 文件關聯
33.3.4 發布選項
33.4 小結
精彩書摘
正如您已經知道的,放在WPF窗口中的所有要素都在一定層次上繼承自UIElement類,包括Label、StackPanel、TextBlock和Image。UIElement定義瞭一些核心事件。例如,每個繼承自UIElement的類都提供MouseDown事件和MouseUp事件。
但當單擊上麵這個特殊標簽中的圖像部分時,想一想會發生什麼事情。很明顯,引發Image.mouseDown,事件和Image.MouseUp事件是閤情閤理的。但如果希望采用相同的方式來處理標簽上的所有單擊事件,該怎麼辦呢?此時,不管用戶單擊瞭圖像、某塊文本還是標簽內的空白處,都應當使用相同的代碼進行響應。
顯然,可為每個元素的MouseDown或MouseUp事件關聯同一個事件處理程序,但這樣會使標記變得雜亂無章且難以維護。WPF使用路由事件模型提供瞭一個更好的解決方案。路由事件實際上以下列三種方式齣現:
與普通.NET事件類似的直接路由事件(direct event)。它們源於一個元素,不傳遞給其他元素。例如,MouseEnter事件(當鼠標指針移到元素上時發生)是直接路由事件。
在包含層次中嚮上傳遞的冒泡路由事件(bubbling event)。例如,MouseDown事件就是昌泡路由事件。該事件首先由被單擊的元素引發,接下來被該元素的父元素引發,然後被父元素的父元素引發,依此類推,直到WPF到達元素樹的頂部為止。
在包含層次中嚮下傳遞的隧道路由事件(tunneling event)。隧道路由事件在事件到達恰當的控件之前為預覽事件(甚至終止事件)提供瞭機會。例如,通過PreviewKeyDown事件可截獲是否按下瞭某個鍵。首先在窗口級彆上,然後是更具體的容器,直至到達當按下鍵時具有焦點的元素。
當使用EventManager.RegisterEvent()方法注冊路由事件時,需要傳遞一個RoutingStrategy枚舉值,該值用於指示希望應用於事件的事件行為。
前言/序言