編寫一個應用不免要用到WPF自己的控件。不論是WinForm仍是網頁都會有本身的控件。只是在寫法和用法上有所不一樣而以。而控件命名卻離不開那幾個單詞。因此不用擔憂判斷不出來哪一個是按扭,哪一個是文本框。舉個例子吧。佈局
HTML性能
<input type="button" value="扭按" />
WinForm學習
private System.Windows.Forms.Button button1;
WPFthis
<Button Content="按扭"/>
看到了吧。本質上來說沒有什麼區別。只要學習他的屬性用法就能夠了。spa
在設計業務界面的時候,咱們必定離不開對界面進行相應的佈局。網頁上經常會用到DIV+CSS來進行佈局。只是筆者想要講的不是要用到什麼技術。而是用到的知識。如:HTML裏面用於佈局元素有DIV、SPAN、Table等。又比如如:WinForm裏面經常會用Panel。那麼WPF裏面是否是也有相似這樣子的知識點。這是固然了。值得注意的是PC端(C/S)和網頁(B/S)在佈局上有所不一樣。PC端這邊多出了一個佈局方式的知識點。通常有分爲絕對佈局(AbsoluteLayout),邊框佈局(BorderLayout),流佈局(FlowLayout),表格佈局(TableLayout),錨點佈局(AnchorLayout)等。可是不是什麼佈局都存在。這個要看設計這門技術的人有沒有把全部的佈局都包進來。設計
WPF用於佈局的元素有:Grid,StackPanel,WrapPanel。這些全是佈局方式的知識。以下3d
Grid:表格佈局或是絕對佈局。code
StackPanel:線性佈局(要麼垂直要麼水平)。component
WrapPanel:流佈局。orm
能夠說上面這三個元素足夠讓大家佈局出令流目的界面出來。可是這只是用於界面上的劃分。而想要作的美麗和漂亮就要用到樣式(Style)。
筆者學習WPF的樣式,最開始是以CSS樣式來學習。如:CSS有三種方式來實現——外部樣式,內部樣式,內嵌樣式。WPF的樣式(Style)實現有幾種方式呢?筆者從開發過程得出來——二種。沒有了內嵌樣式。可是卻又多出了一種概念。這個概念跟控件有關係。因此筆者就在網頁上面下載了一個圖片。以下
咱們能夠從圖片上看到全部經常使用到的控件都會繼承於FrameworkElement類。在FrameworkElement類裏面有一個屬性叫Resources。這個屬性裏面能夠建立和存放各類各樣的樣式。這就意味着每個控件都有本身的樣式存放的地方。也就是說樣式的做用能夠控制到某個控件的範圍。雖然網頁也能夠隨時隨地的建立CSS樣式。只要在聲明的Style裏面就好了。可是他仍是做用於整個網頁。因此WPF在控件或是Window窗體裏面聲明的樣式筆者都喜歡叫他們爲內部樣式。
網頁上的外部樣式是引用一個外部文件。而這個外部文件裏面存放大量的CSS樣式。一樣子WPF也是這樣子的。可是有一個區別的——範圍。網頁上的外部文件最終做用只能是某個網頁,可是WPF的做用能夠是整個應用。不論是多少個Window,多少個UserControl。就是上一章中講到的在Application裏面設置引用的外部文件。也是筆者認爲的外部樣式。以下
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
即然每個控件都會有本身的樣式資源,那問題來了——若是倆個樣式對同一個對象進行修飾,那麼他要什麼樣子選擇呢?舉一個小小的例子吧。
<Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="Red"></Setter> </Style> </Window.Resources> <Grid> <Grid.Resources> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="Blue"></Setter> </Style> </Grid.Resources> <TextBlock Text="1223"></TextBlock> </Grid> </Window>
運行結果:
筆者在Window窗體裏面寫了一個對TextBlock控件進行修飾的樣式,同時前景色設爲紅色。在Grid也寫了一個對TextBlock控件進行修飾的樣式,只是這個顏色爲藍色。結果咱們能夠看到他會選擇最近的樣式。
上面列子裏面筆者是對全部的TextBlock控件進行修飾。跟CSS樣式裏面的元素選擇器有一點相似。每每通常用於自定義控件。還有一種寫法,跟CSS樣式裏面的類選擇器有一點相似。以下
1 <Style x:Key="AlertButton" TargetType="ButtonBase" BasedOn="{StaticResource SystemButtonBase}"> 2 <Setter Property="Cursor" Value="Hand" /> 3 <Setter Property="Margin" Value="8"/> 4 <Setter Property="Padding" Value="4"/> 5 <Style.Triggers> 6 <Trigger Property="IsMouseOver" Value="True"> 7 <Setter Property="Opacity" Value=".7" /> 8 </Trigger> 9 <Trigger Property="IsPressed" Value="True"> 10 <Setter Property="Opacity" Value=".4" /> 11 </Trigger> 12 </Style.Triggers> 13 </Style>
上面的代碼來自於開源項目FirstFloor.ModernUI裏面的。「x:Key」就是至關於CSS樣式裏面的"."。除了這些以外咱們仍是能夠看到baseOn,它用於繼承的。相信你們均可以看得懂是什麼意思。Setter用於設置當前的屬性值。Style.Triggers用於一些觸發動做設置。好比按扭按下時要發生一些什麼樣子的變化。Property="IsPressed" Value="True"就是至關於IF。當前按扭按下去時候,IsPressed的值會變成True。發現服合當前的一個觸發條件。因而就開始執行相應的設置工做。如:上面透明度(Opacity)會成.4。
當前除了上面講到的樣式以外,資源還能夠存放別的東西。如:顏色。算了。只有文字的說明不可以明顯和直接。在筆者在舉個列子吧。
1 <Window x:Class="WpfApp.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:sys="clr-namespace:System;assembly=mscorlib" 5 Title="MainWindow" Height="350" Width="525"> 6 <Window.Resources> 7 <sys:String x:Key="TestString">I am Aomi</sys:String> 8 </Window.Resources> 9 <Grid> 10 <TextBlock Text="{StaticResource TestString}"></TextBlock> 11 </Grid> 12 </Window>
運行結果:
咱們能夠看到。資源文件不僅是樣式,還能夠存放一些系統的值。可是必定要注意引用。如上面的xmlns:sys="clr-namespace:System;assembly=mscorlib"。
在引用樣式方面,WPF也分爲靜態和動態的差異。如上面是靜態引用。動態則要用到關鍵字DynamicResource。那麼動態資源和靜態資源的概念就出來。記得之前有人問過筆者他們之間到底有什麼差異。筆者連什麼是動態資源,什麼是靜態資源都搞不清楚。
靜態資源(StaticResource):會在加載xaml文件的時候進行初始化,並且只有一次。同時運行的時候是不能對資源進行相關的操做。這就意味着後面若是對資源進行修改,是不會同步相應的引用。
動態資源(DynamicResource):會在運行的時候進行初始化,同時運行的時候也能夠操做。顯而後面對資源進行修改會同步到相應的引用。
知道這些以後,讓筆者作了例子吧。就按上面的列子稍微的修改一下吧。
<Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <sys:String x:Key="TestString">I am Aomi</sys:String> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> </Grid.RowDefinitions> <TextBlock x:Name="TbText" Grid.Row="0" Text="{DynamicResource TestString}"></TextBlock> <Button Grid.Row="1" Content="變化" Click="Button_Click"></Button> </Grid> </Window>
後臺按扭的代碼:
private void Button_Click(object sender, RoutedEventArgs e) { this.Resources["TestString"] ="aaa"; }
動態資源的執行結果:
把上面的引用改爲以下靜態引用。
<TextBlock x:Name="TbText" Grid.Row="0" Text="{StaticResource TestString}"></TextBlock>
靜態資源的執行結果:
至於究竟是用動態資源好,仍是用靜態資源好呢?筆者是這樣子理解的:靜態資源他只會在編譯的時候加載一次。後面哪怕你修改他資源也不會發生變化。而動態資源會在編譯的時候也初始化,只是這個時候的值並無被初始化。只有在運行過程當中須要的時候纔會去加載值。因此呢?若是在項目過程當中不須要後面修改變化的話,能夠試着用靜態資源。要明白動態資源可不是加載一次哦。性能仍是要想想的。