在正文開始之前需要介紹一個人: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擁有全部版權和撤銷權利。
[小九的學堂,致力於以平凡的語言描述不平凡的技術。如要轉載,請注明來源:小九的學堂。cnblogs.com/xfuture]
#1. 什么是WPF
WPF(Windows Presentation Foundation)是從.Net Framework從3.0開始加入的提供了全新的多媒體交互用戶圖形界面的類庫,真正做了開發和設計分離的工作。WPF程序可以在桌面運行,也可以在WEB瀏覽器上運行(Silverlight).
WPF使用3D矢量圖形元素來進行圖形渲染,獨立於屏幕分辨率。使用DirectX硬件加速來渲染圖形元素。帶來了更絢麗的色彩和炫酷的效果。.Net 3.0后WPF逐步代替Windows Form成為了新一代的Windows客戶端技術。
#2. 圖形渲染級別(Rendering Tiers)
WPF應用程序會自動檢查顯卡運行能力並分配給一個渲染能力值。指示哪些功能可以通過圖形層次完成。
級別Tier 0 - 沒有硬件加速,所有用軟件繪制。
級別Tier 1 - 一部分使用硬件加速,需要DirectX版本高於9.0. 硬件加速部分:徑向漸變(Radial gradients), 3D亮點圖形計算(3D lighting calculations), 文字渲染(Text rendering), 3D抗鋸齒(3D anti-aliasing).
級別Tier 2 - 大部分使用硬件加速。Directx版本高於9.0
獲得當前渲染級別方法:
int renTier = (RenderCapability.Tier >> 16); MessageBox.Show(string.Format("Tier = {0}", renTier));
#3. 矢量圖形,與分辨率無關
在WPF中,圖形渲染使用的是矢量,而不是位圖。無論是默認控件還是自定義樣式圖像都是與分辨率無關。
WPF代替了位圖在屏幕上渲染圖形每個像素的方法,矢量繪制了一些基礎的單元:如形狀,線,多邊形等。
因為WPF使用了矢量圖形繪制,所以用戶界面元素獨立於實際設備的分辨率來渲染。WPF繪制的圖像尺寸使用了與設備無關的單位,每一個單位是1/96英寸。這意味着用戶界面的元素總是會呈現指定大小,不會被分辨率(DPI)影響。
#4. WPF布局(Layout)
WPF使用了流式布局模型來進行定位元素,而不是使用精確的像素坐標來確定控件的位置。使用了描述性語言XAML來進行定位,類似HTML和CSS網頁布局,極為簡捷方便。
流式布局模型可以使WPF布局可以進行動態調整以適合窗口,呈現流動狀態。WPF界面的大小和分辨率並無關系。
所有的WPF控件都是被承載在一個容器(Container)里,主流的容器有:Grid, DockPanel, StackPanel, WrapPanel.
#5. 樣式(Style)
樣式是類似CSS功能的一組可以重用的設置類似性質控件的屬性值。你可以將之存儲為資源(Resource), 然后應用在多個控件上。舉個樣例,你應用中所有的button都是一個風格,你需要先定義一個樣式作為靜態資源(StaticResource)
<Window.Resources> <Style x:Key="StdButton" TargetType="Button"> <Setter Property="Width" Value="100"/> <Setter Property="Control.Background" Value="AliceBlue"/> <Setter Property="Control.FontFamily" Value="Calibri" /> <Setter Property="Control.FontWeight" Value="Bold" /> </Style> </Window.Resources>
然后你就可以應用到你需要樣式的button上:
<Button Content="I'm Tiny Nine" Style="{StaticResource StdButton}" /> <Button Content="Follow Me" Style="{StaticResource StdButton}" /> <Button Content="Not Follow me"/>
#6. 模板(Template)
模板類似與樣式(Style), 但實際並不相同。模板可以更換一個UI控件的外觀,但不能改變其行為。一般Template都定義在Style之中。WPF每一個控件都有其默認的模板,你可以撰寫一個模板來代替其默認模板來進行私人定制。
通過改變模板的屬性來改變其模板。下面是一個例子,我們創建了一個新的button,它具有了加厚的藍色邊框。
<Window.Resources> <ControlTemplate x:Key="Crazy" TargetType="Button"> <Border BorderBrush="Blue" Background="White" BorderThickness="3"> <ContentPresenter></ContentPresenter> </Border> </ControlTemplate> </Window.Resources> <Grid Height="auto" Width="503"> <StackPanel Height="100" HorizontalAlignment="Left" Margin="85,139,0,0" Name="stackPanel1" > <Button Content="Crazy template" Template="{StaticResource Crazy}" /> <Button Content="Default template" /> </StackPanel> </Grid>
#7. 命令(Commands)
WPF提供對命令(Commands)的支持,Command在WPF中是事件的進化體。WPF可以將Command綁定到空間上,來減少重復的事件代碼。多個控件可以使用同一個Command邏輯。Command可以使UI和邏輯分離,實現了UI操作,后台執行命令邏輯。WPF程序內置了很多命令,如Paste, Copy, Save等。
下面代碼展示了控件綁定命令的兩種方式:
<Button Content="New" Command="ApplicationCommands.New"/> // Create binding--which binds the command to your code CommandBinding binding = new CommandBinding(ApplicationCommands.New); binding.Executed += new ExecutedRoutedEventHandler(CommandNew_Executed); this.CommandBindings.Add(binding);
2014-05-22 會更新后續8-14,敬請期待。