WPF 雜談——資源文件

編寫一個應用不免要用到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>

靜態資源的執行結果:

至於究竟是用動態資源好,仍是用靜態資源好呢?筆者是這樣子理解的:靜態資源他只會在編譯的時候加載一次。後面哪怕你修改他資源也不會發生變化。而動態資源會在編譯的時候也初始化,只是這個時候的值並無被初始化。只有在運行過程當中須要的時候纔會去加載值。因此呢?若是在項目過程當中不須要後面修改變化的話,能夠試着用靜態資源。要明白動態資源可不是加載一次哦。性能仍是要想想的。

相關文章
相關標籤/搜索