2000條你應知的WPF小姿勢 基礎篇<1-7>


  在正文開始之前需要介紹一個人: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,敬請期待。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM