前面的記錄有的地方已經用到了資源,本文就來詳細的記錄一下WPF中的資源。咱們平時的「資源」一詞是指「資財之源」,是創造人類社會財富的源泉。在計算機程序中,只要是對程序有用的對象均可以統稱資源。不過本文只記錄WPF對象級資源和二進制資源。css
在WPF中,每個界面元素都是一個對象,而且都有一個名爲Resources的屬性,這個屬性繼承於FrameworkElement類,其類型爲ResourceDictionary。因爲元素的屬性名是複數形式,因此每個對象能夠擁有多個資源,因爲資源的多樣化,獲取到的資源的類型爲object類型,因此在獲取到資源時,必要時要進行轉化成符合本身要求的類型;由其類型能夠知對象資源是以鍵值對的形式來存儲的,當須要某個資源時,能夠經過key索引來獲取。下面看一個小實例:html
<Window x:Class="Chapter_08.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> <ResourceDictionary> <sys:String x:Key="str"> 我是資源 </sys:String> </ResourceDictionary> </Window.Resources> <Grid x:Name="grid"> <TextBlock x:Name="textblock" Text="{StaticResource ResourceKey=str}"/> </Grid> </Window>
在上面代碼中資源爲屬性元素,因此<ResourceDictionary>是能夠省略掉的,下面是在後臺的等效代碼:web
this.Resources["str1"] = "我是資源"; this.textblock.Text = this.FindResource("str1") as string;
因爲比較簡單,因此不貼效果圖了。下面記錄一下,檢索資源的順序,好比上面的例子,Textblock會先看一下自身有沒有資源的Key爲str的,若是沒有發現的話,會繼續沿着邏輯樹往上找(也就是Window上找)。直到發現爲止,若是在XAML中沒有找到的話,程序還會在Application.Resources中找找看,若是再沒有的話,那麼就說我找不到(拋出異常)。提到「往外找」,若是有web經驗的話,就想起js和css均可以在外面找,來控制頁面的樣式,WPF中徹底也能夠實現這樣的功能。因爲涉及到style,在此僅提一下使用方法: app
<Window.Resources> <ResourceDictionary Source="***.xaml"> </Window.Resources>
這個很像html的外聯式寫法。this
咱們實際生活中包含可再生資源和非可再生資源。在計算機裏面的資源也是有分類的。主要分爲靜態資源(StaticResource)和動態資源(DynamicResource)。靜態資源是在程序運行時,直接把資源讀到內存裏面,之後就不再會發生改變;動態資源是能夠改變的,具體能夠根據狀況使用。下面經過簡單的實例來講明其區別:spa
XAML代碼:code
<Window x:Class="Chapter_08.ResourceType" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="ResourceType" Height="150" Width="150" Background="Brown"> <Window.Resources> <sys:String x:Key="DynamicRes">動態資源</sys:String> <sys:String x:Key="StaticRes">靜態資源</sys:String> </Window.Resources> <StackPanel> <TextBox x:Name="txt1" Text="{DynamicResource ResourceKey=DynamicRes}" Margin="10"/> <TextBox x:Name="txt2" Text="{StaticResource ResourceKey=StaticRes}" Margin="10"/> <Button x:Name="btn" Content="資源類型區分" Click="btn_Click_1" Height="25" Margin="5"/> </StackPanel> </Window>
點擊事件代碼:xml
private void btn_Click_1(object sender, RoutedEventArgs e) { this.Resources["StaticRes"] = "靜態資源發生改變"; this.Resources["DynamicRes"] = "動態資源發生改變"; }
效果如圖1:htm
圖1對象
和對象級資源同樣,二進制資源也是對象,可是其所在的位置不是在窗體上,通常在項目下的文件夾或者屬性文件件下面。除此以外,由於控件查找資源時,會沿着邏輯樹查找,若是在樹上找不到資源,最後還會在Application.Resources裏面找,因此越是靠上面的資源,能利用資源的元素越多。(能夠理解爲站的越高,越容易被更多的元素看到,由於元素都是往上看的)。 不少時間都有程序用到外部的文件,爲了防止操做不當,使文件與程序分離,破壞了程序的完整性,因此讓文件編譯到目標文件中(.exe、.dll文件)以二進制的數據存在,這就是要記錄的二進制資源。若是要添加的資源是字符串而不是文件,那麼可使用應用程序Properties名稱空間中的Resources.resx資源文件,若是是XAML要訪問該資源的話,要把訪問修飾符改成Public。如圖2
如2
在後臺代碼調用資源:
Properties.Resources.Password
在XAML中調用形式:
xmlns:prop="clr-namespace:Chapter_08.Properties" Text="{x:Static prop:Resources.Password}"
若是須要改成中文的話,能夠直接去資源裏面修改。該類資源便於國際化、本地化。除此以外還有一類就是文件型二進制資源。把文件編譯成二進制文件,下面說一下具體的作法,在項目中添加一個文件夾Resources(能夠是其餘的名字)而後添加現有項,而後設置資源的屬性的生成操做選項爲:Resource,且複製到目錄選項爲:不復制, 若是不但願以資源的形式使用外部文件,那麼生成操做選項爲:None,複製到目錄選擇 :始終複製。
一種引用資源是在XAML中引用<Image x:Name="image" Source="Resources/Images/課程表.jpg" Stretch="Fill"/>
另外一中引用時在cs後臺代碼中引用,其中有絕對路徑和相對路徑之分,下面列出兩種形式:
//Uri imgUri1 = new Uri(@"Resources/Images/課程表.jpg", UriKind.Relative); Uri imgUri1 = new Uri(@"pack://application:,,,/Resources/Images/課程表.jpg", UriKind.Absolute); this.image.Source = new BitmapImage(imgUri1);
其中相對路徑直接寫程序下面的文件夾到文件的路徑,絕對路徑格式爲pack://application,,,:[/程序集名][/可選版本號][/文件夾名]/文件名稱。
固然,隨着資源被編譯成二進制文件,因此生成的exe文件也變大了。
本文主要記錄了對象資源和二進制資源以及動態資源和靜態資源的區分,能夠根據具體狀況選擇。本文是讀書筆記,裏面不免有理解不對的地方,歡迎討論!下一篇:《深刻淺出WPF》筆記——模板篇。