在正文開始之前需要介紹一個人:Sean Sexton. 來自明尼蘇達雙城的軟件工程師,對C#和WPF有着極深的熱情。最為出色的是他維護了兩個博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。聽到博客名字就懂這個人有多偉大了吧。他以類似微博式的150字簡短語言來每天更新一條WPF和C#重要又容易被遺忘的知識。Follow他的博客也有一段日子了,很希望能夠分享給大家。
本系列我不僅會翻譯他的每一個tip,也會加入自己開發之中的看法和見解,希望能夠以更貼近的語言來展示大師的風采。本系列我希望自己也能和他一樣堅持下來,每天的進步才能促成偉大。
如果大家更想了解這個偉大的程序員,這個是訪談鏈接,他在訪談中有談到自己生平和對編程相關學習的看法,我覺得對大家會幫助很大,有時間后面會出一篇翻譯這個訪談的文章供大家閱讀,希望大家能夠關注。
在這里鄭重說明.該系列是基於Sean Sexton先生的英文博客, Sean Sexton擁有全部版權和撤銷權利。
前文:<1-7>WPF, 渲染, 矢量, 布局, 樣式, 模板, 命令
[小九的學堂,致力於以平凡的語言描述不平凡的技術。如要轉載,請注明來源:小九的學堂。cnblogs.com/xfuture]
#8. Xaml和Code Behind
WPF應用是由前端代碼Xaml(可擴展應用程序標記語言)和后台代碼(托管代碼)組成。標記性語言Xaml定義了UI的布局和外觀,后台定義了行為和邏輯。WPF技術實現了UI和后台邏輯的分離。
Xaml是一個基於Xml的聲明式標記語言編寫的。Xaml中組織了所有的控件,以及他們的位置和父子關系。后端.cs托管代碼描述了運行時UI的邏輯和行為。在編譯階段xaml和xaml.cs會編譯為一個class, 所以xaml.cs你可以看出是patical的。
下面代碼是一個Xaml布局的樣例:
1 <Grid> 2 <StackPanel> 3 <Button Content="Save" Height="23" Name="btnSave" Width="75" Click="btnSave_Click" /> 4 <Button Content="Load" Height="23" Name="btnLoad" Width="75" Click="btnLoad_Click" /> 5 </StackPanel> 6 </Grid>
#9. 標記性語言的優勢
使用標記性語言Xaml和后台代碼Xaml.cs模型開發比一切都定義在代碼中有着很多的優勢。使用Xaml的好處有:
1. 可以在不影響控件行為的情況下更改用戶界面的樣式和用戶體驗。
2. 設計人員可以和開發同時工作,一個負責Xaml做用戶界面, 一個負責撰寫后台邏輯。分工兩不誤。
3. 微軟提供了強大的設計工具Expression Design和Blend, 使用工具可以免寫代碼, 設計的界面可以直接導出成Xaml.
4. Vs2013已經和Blend做了很好的集成,可以更高效率的做設計和開發。
#10. 基於Page的頁面導航
WPF應用程序可以用一些pages的集合以及其頁面導航機制來進行構建。和WindowsForm的文檔流式的模型不同,它擁有一個主窗體和一個可以彈出的提醒窗口。
如果想要創建一個基於Page的WPF程序,你需要定義一個Page來代替傳統的Window:
<Page x:Class="WpfApplication7.Page1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" Title="Page1"> <Grid> <Label Content="This is a page, not a window." Height="28" HorizontalAlignment="Left" Margin="52,75,0,0" Name="label1" VerticalAlignment="Top" /> </Grid> </Page>
同時你需要指定app的starturi為該page
<Application x:Class="WpfApplication7.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Page1.xaml"> </Application>
此時你便擁有了一個基於Page導航的WPF應用程序。
#11. WPF vs Silverlight vs ASP.NET
WPF, Silverlight, ASP.NET是微軟開發的三大平台。下面列出三種平台各自的特點
WPF:
1. 開發Windows應用程序
2. 以最豐富的用戶控件和windows特定功能構建的客戶端用戶界面。
3. 只能運行在Windows上
4. 需要完整的.net framework支持。
Silverlight:
1. 開發運行在Web端
2. 輕量客戶端,豐富的UI控件,類似於WPF客戶端呈現
3. 需要安裝Silverlight插件在瀏覽器上
4. Silverlight的Moonlight版本可以在linux上運行
5. 第一次加載時需要安裝SL插件。
ASP.NET:
1. 開發Web應用程序
2. 輕量客戶端,有着通用的Web控制
3. 可以在服務端運行,也可以運行在所有支持HTML的客戶端,包括移動設備的瀏覽器
4. 不需要在客戶端安裝插件
#12. 在3D硬件加速應用中使用Direct3D
雖然WPF提供3D繪制,但是3D應用中還是需要Direct3D來進行3D圖形的繪制以呈現其最大性能。
而且WPF 4.0是基於DirectX9.0, 所以並不支持Direct3D 10 和 Direct3D 11。
#13. WPF的版本記錄
雖然下面列出WPF版本的歷史記錄和相對應的VS版本。由於WPF是.NET Framework框架一部分,所以版本號是跟着.NET Framework的。下面就是其記錄:
.NET Framework 3.0 – Nov, 2006
- 1st release of WPF
- CLR version 2.0
- Visual Studio 2005 SP1
- Incl w/Windows Vista
- .NET Framework 3.5 – Nov, 2007
- Various improvements to WPF
- CLR version 2.0 SP1
- Visual Studio 2008
- Incl w/Windows 7
- .NET Framework 3.5 SP1 – Aug, 2008
- Performance improvements (et al) to WPF
- CLR version 2.0 SP2
- Visual Studio 2008 SP1
- .NET Framework 4.0 – Apr, 2010
- Various improvements to WPF
- CLR version 4.0
- Visual Studio 2010
- .NET Framework 4.5 – Aug, 2012
- Various improvements to WPF
- CLR version 4.5
- Visual Studio 2012
- Incl w/Windows 8
#14. Silverlight and WPF 不同之處
Silverlight原名叫做WPF/E(WPF/Everywhere), 個人覺得原名很拽。通過名字就可以知道SL和WPF遵循相同的編程模型和大部分空間,可以理解為SL是WPF的一個瀏覽器特殊版本。
核心區別:
1. WPF只運行在WIndows平台
2. WPF需要.NET Framework
3. SL是WPF控件的一個子集
4. SL使用了.NET FRAMEWORK和CLR的子集
WPF獨有:
1. 支持流文件 Flow document
2. 支持動態資源 Dynamic resources
3. Merged dictionaries(SL3已有)
4. 重置樣式到一個新的FrameworkElement
5. Style繼承(SL4已有)
6. 隱式樣式TargetType屬性(SL5已有)
7. Styles, ControlTemplates, DataTemplate的Triggers
8. Routed commands
9. 自定義標記擴展(Custom markup extensions)(SL5已有)
10. 運行時訪問的可視化和邏輯樹(Visual Tree 已有 SLSPY工具 也可以看到)
11. 一些WPF獨享的控件(AccessText, BulletChrome, ButtonChrome, ContextMenu, Decorator, DocumentPageView, DocumentViewer, GridViewColumnHeader, GridViewRowPresenter, GroupBox, GroupItem, InkCanvas, Menu, MenuItem, PageContent, Ribbon, Separator, StatusBar, TickBar, ToolBar, Track, UniformGrid)
SL獨有:
1. 深度縮放(Deep Zoom)
2. 一些SL獨享控件( AutoCompleteBox, DataPager, DescriptionViewer, HyperlinkButton, MultiScaleImage, NumericUpDown, ValidationSummary)
更新后續15-21,敬請期待。