10 WPF资源
資源是保持有用對(duì)象在附近的一種方法。諸如:刷子,樣式,或模板對(duì)象。因此,你能更容易地重用他們。
盡管能用代碼創(chuàng)造和操縱資源,通常用XAML標(biāo)記。一個(gè)資源被定義以后,你能使用它,在窗口中,標(biāo)記的剩余部分(或,在一個(gè)應(yīng)用資源的情況下,遍及你的應(yīng)用的剩余部分)。這技術(shù)簡(jiǎn)化你的標(biāo)記,節(jié)省重復(fù)的編碼,并且允許你存儲(chǔ)用戶界面細(xì)節(jié)(諸如你的應(yīng)用的顏色方案)在一個(gè)集中的地方因而他們能被容易地修改。對(duì)象資源也是重用WPF樣式基礎(chǔ)。
資源基礎(chǔ)
你定義資源的位置可以在代碼中、或在標(biāo)記的各種地方(除了特殊控件、特殊窗口、或者整個(gè)應(yīng)用程序)。
資源的好處包括:效率高,可維護(hù)性,適應(yīng)性。
資源集合
每個(gè)元素包括一個(gè)Resources屬性,存儲(chǔ)一個(gè)資源的詞典集合。是ResourceDictionary類的一個(gè)實(shí)例。資源集合能持有任何類型的對(duì)象,由字符串索引。
盡管每個(gè)元素包括Resources屬性(定義在FrameworkElement類),最常在窗口元素上定義資源。那是因?yàn)槊總€(gè)元素首先訪問(wèn)自己的資源集合,然后是它父元素的資源集合。
例如,考慮帶有三個(gè)按鈕的窗口,第一個(gè)和最后一個(gè)按鈕使用同樣的刷子。為了重用,我們?cè)谫Y源中為窗口定義了圖像刷子。
<Window.Resources><ImageBrush x:Key="TileBrush" TileMode="Tile"ViewportUnits="Absolute" Viewport="0 0 32 32"ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush> </Window.Resources>考慮第一個(gè)特性x:Key,這為資源分配了一個(gè)名字,用于在資源集合中檢索。名字可以使用任何字符串。
引用資源使用標(biāo)記擴(kuò)展,有兩種:靜態(tài)資源,動(dòng)態(tài)資源。靜態(tài)資源在窗口第一次創(chuàng)建時(shí),被設(shè)置一次。動(dòng)態(tài)資源每當(dāng)資源改變時(shí),被應(yīng)用。這個(gè)例子中,圖像刷子不會(huì)改變,所以使用靜態(tài)資源。
<Button Background="{StaticResource TileBrush}" Margin="5" Padding="5" FontWeight="Bold" FontSize="14">A Tiled Button </Button>動(dòng)態(tài)資源具有靜態(tài)資源的功能,只是多一些開(kāi)銷。
<Button Background="{DynamicResource TileBrush}">資源的層次結(jié)構(gòu)
每個(gè)元素都有自己的資源集合,WPF沿元素樹(shù)向上執(zhí)行一個(gè)遞歸的搜索,查找你希望的資源。在當(dāng)前的例子中,你能移動(dòng)圖像刷子資源從窗口的資源集合到StackPanel的資源集合。應(yīng)用程序的工作方式不會(huì)變化。你也能將圖像刷子放在按鈕的資源集合,但是每個(gè)按鈕都要定義一次。
當(dāng)使用一個(gè)靜態(tài)的資源,必須在引用資源之前定義資源。
結(jié)果,如果你在按鈕元素中放置資源,需要先定義資源,再設(shè)置背景。
<Button Margin="5" Padding="5" FontWeight="Bold" FontSize="14"><Button.Resources><ImageBrush x:Key="TileBrush" TileMode="Tile"ViewportUnits="Absolute" Viewport="0 0 10 10"ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush></Button.Resources><Button.Background><StaticResource ResourceKey="TileBrush"/></Button.Background><Button.Content>Another Tiled Button</Button.Content> </Button>這個(gè)例子中,使用嵌套元素引用資源。使用ResourceKey指向正確的資源。
可以在不同的資源集合中使用相同的資源名:
<Window x:Class="Resources.TwoResources"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Resources" Height="300" Width="300" ><Window.Resources><ImageBrush x:Key="TileBrush" TileMode="Tile"ViewportUnits="Absolute" Viewport="0 0 32 32"ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush></Window.Resources><StackPanel Margin="5"><Button Background="{StaticResource TileBrush}" Padding="5"FontWeight="Bold" FontSize="14" Margin="5" >A Tiled Button</Button><Button Padding="5" Margin="5"FontWeight="Bold" FontSize="14">A Normal Button</Button><Button Background="{DynamicResource TileBrush}" Padding="5" Margin="5"FontWeight="Bold" FontSize="14"><Button.Resources><ImageBrush x:Key="TileBrush" TileMode="Tile"ViewportUnits="Absolute" Viewport="0 0 32 32"ImageSource="sadface.jpg" Opacity="0.3"></ImageBrush></Button.Resources><Button.Content>Another Tiled Button</Button.Content></Button></StackPanel> </Window>在這種情況下,按鈕使用它發(fā)現(xiàn)的第一個(gè)元素。因?yàn)樗麖淖约洪_(kāi)始搜索資源集合,第二個(gè)按鈕使用sadface.jpg圖像,而第一個(gè)按鈕從容器窗口獲得刷子,使用happyface.jpg圖像。
靜態(tài)資源和動(dòng)態(tài)資源
靜態(tài)資源一次性從資源集合抓取對(duì)象。
動(dòng)態(tài)資源每當(dāng)需要時(shí)查找資源集合中的對(duì)象。
僅當(dāng)下列情況使用動(dòng)態(tài)資源:
- 資源依賴于系統(tǒng)設(shè)置(如Windows當(dāng)前顏色和字體)。
- 以編程方式替換資源對(duì)象(例如,實(shí)現(xiàn)某種動(dòng)態(tài)皮膚特征)。
非共享資源
通常,當(dāng)在多個(gè)地方使用一個(gè)資源時(shí),使用的是相同的對(duì)象實(shí)例。也就是說(shuō),資源是共享的。
為關(guān)閉共享,使用Shared屬性:
<ImageBrush x:Key="TileBrush" x:Shared="False" ...></ImageBrush>每次引用非共享元素,都會(huì)克隆一個(gè)新的資源實(shí)例。
在代碼中訪問(wèn)資源
在代碼中使用 FrameworkElement.FindResource()方法引用資源:
private void cmdChange_Click(object sender, RoutedEventArgs e) {Button cmd = (Button)sender;ImageBrush brush = (ImageBrush)sender.FindResource("TileBrush");... }另一個(gè)是TryFindResource()方法。
應(yīng)用程序資源
應(yīng)用程序范圍的資源定義在App.xaml文件中,例如:
<Application x:Class="Resources.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"StartupUri="Menu.xaml"><Application.Resources><ImageBrush x:Key="TileBrush" TileMode="Tile"ViewportUnits="Absolute" Viewport="0 0 32 32"ImageSource="happyface.jpg" Opacity="0.3"></ImageBrush></Application.Resources> </Application>系統(tǒng)資源
System.Windows名字空間有三個(gè)類: SystemColors, SystemFonts, 和SystemParameters。
SystemParameters包裹一個(gè)巨大的設(shè)置列表。用于描述各種屏幕元素的標(biāo)準(zhǔn)尺寸、鍵盤和鼠標(biāo)設(shè)置,和屏幕尺寸,和是否打開(kāi)各種圖形效果(如熱跟蹤,滴落陰影,和拖拽時(shí)顯示窗口內(nèi)容)。
這三個(gè)類暴露的接口都是靜態(tài)屬性。
以Color結(jié)尾的屬性用法:
label.Foreground = new SolidBrush(SystemColors.WindowTextColor);更有效率地,類中也預(yù)定義了刷子屬性,這些屬性以Brush結(jié)尾:
label.Foreground = SystemColors.WindowTextBrush;使用屬性擴(kuò)展設(shè)置前景屬性:
<Label Foreground="{x:Static SystemColors.WindowTextBrush}">這個(gè)例子沒(méi)有使用動(dòng)態(tài)資源,這得到的只是系統(tǒng)變量的一個(gè)快照,當(dāng)變量改變時(shí),用戶界面不會(huì)隨之改變。系統(tǒng)類還定義了一族以Key結(jié)尾的屬性,用于引用動(dòng)態(tài)資源。這是使用動(dòng)態(tài)資源的例子:
<Label Foreground="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}">動(dòng)態(tài)資源使用的鍵由SystemColors.WindowTextBrushKey屬性定義。因?yàn)樵搶傩允庆o態(tài)的,又需要包裹在靜態(tài)標(biāo)記擴(kuò)展中。
資源詞典
資源詞典用于多個(gè)工程間共享資源。詳見(jiàn)277頁(yè)。
轉(zhuǎn)載于:https://www.cnblogs.com/cuishengli/archive/2013/06/08/3126931.html
總結(jié)
- 上一篇: CSS样式中” 大于号”
- 下一篇: OOP设计模式[JAVA]——03职责链