WPF資源WPF資源系統(tǒng)是一種保管一系列對(duì)象(如常用的畫刷、樣式或模版)的簡單辦法,從而使您更容易地復(fù)用這些對(duì)象。 WPF允許在代碼中以及在標(biāo)記中的各個(gè)位置定義資源(和特定的控件、窗口一起定義,或在整個(gè)應(yīng)用程序中定義)。資源具有如下優(yōu)點(diǎn)。
資源集合每個(gè)元素都有Resources屬性,該屬性存儲(chǔ)了一個(gè)資源字典集合(它是ResourceDictionary類的實(shí)例)。資源集合可包含任意類型的對(duì)象,并根據(jù)字符串編寫索引。 <Window.Resources> <ImageBrush x:Key="TitleBrush" TileMode="Tile" ViewboxUnits="Absolute" Viewport="0 0 32 32"ImageSource="" Opacity="0.3"></ImageBrush> </Window.Resources> <StackPanel> <Button Background="{StaticResource TitleBrush}">Requery</Button> </StackPanel> 資源的層次每個(gè)元素都有自己的資源集合,為了找到期望的資源,WPF在元素樹中進(jìn)行遞歸搜索。 只要不在同一集合中多次使用相同的資源名,就可以重用資源名稱。 <Window.Resources> <ImageBrush x:Key="TitleBrush" TileMode="Tile" ViewboxUnits="Absolute" Viewport="0 0 32 32" ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush> </Window.Resources> <StackPanel> <Button Background="{StaticResource TitleBrush}">Requery</Button> <Button Background="{DynamicResource TitleBrush}"> <Button.Resources> <ImageBrush x:Key="TitleBrush" TileMode="Tile" ViewboxUnits="Absolute" Viewport="0 0 32 32" ImageSource="abc.jpg" Opacity="0.3"></ImageBrush> </Button.Resources> <Button.Content>Another Titled Button</Button.Content> </Button> </StackPanel> 靜態(tài)資源和動(dòng)態(tài)資源上面的代碼設(shè)置后如果執(zhí)行如下代碼 ImageBrush brush=(ImageBrush)this.Resources["TitleBrush"]; brush.Viewport = new Rect(0,0,5,5); 上述代碼從Window.Resources中檢索畫刷,并改變畫刷平鋪的尺寸,縮小笑臉圖像并壓縮圖像模式使其更加緊湊。因?yàn)槭庆o態(tài)資源正常上面的按鈕是不會(huì)有變化, 但是這一變化會(huì)傳遞給上面的按鈕,更新Viewport屬性。這是因?yàn)锽rush類繼承自Freezable類。改類有一個(gè)基本變化跟蹤特性。這意味著無論何時(shí)在WPF中改變畫刷,所有使用該畫刷的控件都會(huì)自動(dòng)更新。靜態(tài)資源和動(dòng)態(tài)資源的區(qū)別在于靜態(tài)資源只從資源集合中獲取對(duì)象一次,動(dòng)態(tài)資源每次需要對(duì)象時(shí)都會(huì)重新從資源集合中查找對(duì)象。例如: this.Resources["TitleBrush"] = new SolidColorBrush(Colors.LightBlue); 執(zhí)行如上代碼,對(duì)于靜態(tài)資源沒影響,動(dòng)態(tài)資源會(huì)發(fā)生變化。 使用動(dòng)態(tài)屬性的情況
非共享資源正常情況下資源使用的是統(tǒng)一對(duì)象實(shí)例,這種行為成為共享,如果希望每次都創(chuàng)建一個(gè)新的對(duì)象可如下設(shè)置。x:Shared="False" <ImageBrush x:Key="TitleBrush" x:Shared="False" TileMode="Tile" ViewboxUnits="Absolute" Viewport="0 0 32 32" ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush> 通過代碼訪問資源 private void txt_TextChanged(object sender, RoutedEventArgs e) { Button cmd = (Button)sender; ImageBrush brush = (ImageBrush)cmd.FindResource("TitleBrush"); } 可使用TryFindResource()代替FindResource()。如果找不到資源會(huì)返回null,而不是拋異常。 應(yīng)用程序資源窗口不是查找應(yīng)用程序資源的最后一站,如果在控件或其他容器中知道包含窗口或頁面找不到指定的資源。WPF會(huì)繼續(xù)查找為應(yīng)用程序定義的資源。在Visual Studio中,這些資源在App.xaml文件的標(biāo)記中定義的資源。 <Application x:Class="HelloWpf.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="GridDemoWindow.xaml"> <Application.Resources> <ImageBrush x:Key="TitleBrush" TileMode="Tile" ViewboxUnits="Absolute" Viewport="0 0 32 32" ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush> </Application.Resources> </Application> 應(yīng)用程序資源為整個(gè)應(yīng)用程序中重用對(duì)象提供了一種極佳的方法。 系統(tǒng)資源當(dāng)某個(gè)元素查找資源時(shí),應(yīng)用程序資源仍然不是最后一站。如果沒有在應(yīng)用程序資源中找到所需的資源,元素還會(huì)繼續(xù)查找系統(tǒng)資源。 系統(tǒng)資源的三個(gè)類
資源字典如果希望多個(gè)項(xiàng)目中共享資源,可創(chuàng)建資源字典。資源字典只是xaml文檔,除了存儲(chǔ)希望使用的資源外,不做其他任何事情。 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ImageBrush x:Key="TitleBrush" TileMode="Tile" ViewboxUnits="Absolute" Viewport="0 0 32 32" ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush> </ResourceDictionary> 使用資源字典將其整合到應(yīng)用程序資源中。
<Application x:Class="HelloWpf.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="GridDemoWindow.xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="AppBrushs.xaml"></ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application> |
|