WPF=Code+Markup 筆記 21
21章 資源
WPF的資源有兩種,一種是“元件資源”(assembly resource),是將工程中某些檔案編譯成資源。這是二進位制檔案,如icon和點陣圖,被儲存在元件zhong(EXE或EXE),並且可以利用Uri物件來存取。
另一種是“區域性定義的資源”,因為其定義在XAML或C#中,就如同靜態只讀變數,資源物件在執行時被建立一次,並且被引用它們的element所共享。
注:
常量: const double fontsize = 14;
靜態只讀變數: static readonly double fontsize = 14;
二者的區別:常量在編譯期間jisuan,並且在編譯期間做值的替代;而靜態只讀變數是在執行期間計算的。
所有資源都儲存在一個ResourceDictionary型別的物件中,而且FrameworkElement、FrameworkContentElement、Application這三個基本類都定義了一個Resources屬性,而定義在其中的資源,則具有x:Key的屬性。示例如下:
<StackPanel.Resources>
<s:Double x:Key="fontsizeLarge">
18.7
s:Double>
StackPanel.Resources>
這裡s表示System名稱空間:xmlns:s="clr-namespace:System;assembly=mscorlib">
有兩種使用方式,都牽涉到:
1)屬性元素:
<Button>
<Button.FontSize>
<StaticResource ResourceKey="fontsizeLarge" />
Button.FontSize>
Button with large FontSize
Button>
2)將key放入大括號中:
<Button FontSize="{StaticResource fontsizeLarge}" >
Button with small FontSize
Button>
注:在這個大括號中,不可以出現引號;對於字串中出現的大括號,要在此之前,假如一組空的大括號進行轉義:
<TextBlock Text="{}{Hello World!}" />
這些資源要定義在元素的最前端,保證其在被引用之前定義。
在一個資源塊中,所有key不能重複,但是在不同級別是可以的。當定位一個資源時,會從這個資源所在位置開始查詢,並沿著這個樹結構向上直到找到這個key為止——這對建立Style很有用。
我們也可以將控制元件或element定義為資源,但是隻能使用一次,因為它們只能有一個父親:
<Button.Resources>
<Button x:Key="btn" FontSize="24">
Button with large FontSize
Button>
Button.Resources>
C#的資源操作程式碼:
stack.Resources.Add("blueText", new SolidColorBrush(Colors.Blue));
上述的三個基本類FrameworkElement、FrameworkContentElement、Application還定義了FindResource方法,根據key查詢資源,並向上遞迴直到找到為止。
x:Static標記用來引用類中的靜態屬性/欄位,或者列舉成員。如:
<Label Content="{x:Static s:SomeClass.SomeStaticProp}" />
這裡要在XAML頭引進: xmlns:s="clr-namespace:Wpf21"
並在SomeClass類中定義SomeStaticProp靜態欄位,設定它的值,才能在這個XAML中使用SomeClass類。
當然我們還可以使用系統屬性,如Environment.OSVersion。
注意到,SystemColors、SystemParameters、SystemFonts類都有一大堆靜態屬性,XAML可以利用x:Static來取用這些屬性。而且這些靜態屬性都是成對存在的。比如說有一個CaptionFontSize,就有對應的加上key字尾的CaptionFontSizeKey屬性。
public static double CaptionFontSize { get; }
public static ResourceKey CaptionFontSizeKey { get; }
於是可以這樣使用:
Background="{StaticResource {x:Static SystemColors.ActiveCaptionBrushKey}}"
這和
Background="{StaticResource SystemColors.ActiveCaptionBrush}"
是等效的。
為了讓上面的資源隨著系統配置的改變而相應變化,使用DynamicResource替代StaticResource。
Background="{DynamicResource SystemColors.ActiveCaptionBrush}"
注:StaticResource中的key被用來存取物件一次,然後物件會被保留;而DynamicResource中的key會被保留,物件需要的時候會被呼叫。這種DynamicResource還能保證資源在使用後再定義也不會出錯。
當然也有特例:先在資源中為Color定義為DynamicResource,然後在XAML中為以StaticResource的方式使用Brush。如下所示:
<StackPanel.Resources>
<SolidColorBrush x:Key="dynabrush2"
Color="{DynamicResource
{x:Static SystemColors.ActiveCaptionColorKey}}" />
StackPanel.Resources>
<Label Foreground="{StaticResource dynabrush2}" />
此時,系統顏色的改變,Label也會跟著改變前景色。這是因為SolidColorBrush會跟著Color改變,而Label對這個Brush的引用不會改變。
如果使用方法改變為:
<Label Foreground="{DynamicResource dynabrush2}" />
則系統顏色的改變不會影響Label的前景色。因為系統顏色的改變導致Label新建一個dynabrush2物件,則重新初始化這個SolidColorBrush,而SystemColors.ActiveCaptionColorKey應該是這個筆刷建構函式的引數。
區域性資源定義會覆蓋系統設定。
ResourceDictionary檔案的使用,為多個專案提供共享資源。
這些檔案以ResourceDictionary根節點開始,如下MyResources1.xaml:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15123181/viewspace-422899/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WPF=Code+Markup 筆記 8筆記
- Application=Code+Markup 讀書筆記 19APP筆記
- WPF筆記(1.1 WPF基礎)——Hello,WPF!筆記
- Application=Code+Markup 讀書筆記 1-4APP筆記
- Application=Code+Markup 讀書筆記 5-7APP筆記
- 21JavaScript筆記(1)JavaScript筆記
- WPF製作的小型筆記本-仿有道雲筆記筆記
- jQuery自學筆記(21-30)jQuery筆記
- Java 21的Pseudorandom的筆記Javarandom筆記
- Redis核心技術筆記21-25Redis筆記
- Object C學習筆記21-typedef用法Object筆記
- 重學前端筆記21-css選擇器前端筆記CSS
- docker筆記21-k8s的使用入門Docker筆記K8S
- 演算法學習筆記(21):數論分塊演算法筆記
- dotnet 讀 WPF 原始碼筆記 渲染收集是如何觸發原始碼筆記
- WPF 入門筆記 - 01 - 入門基礎以及常用佈局筆記
- 21天學通C++(第四版)筆記C++筆記
- C/C++求職寶典21個重點筆記(常考筆試面試點)C++求職筆記筆試面試
- iOS學習筆記21 推送證書與祕鑰申請iOS筆記
- WPF學習日記11
- WPF學習日記9
- WPF學習日記29
- git checkout 對工作目錄的影響 —— Git 學習筆記 21Git筆記
- dotnet 讀 WPF 原始碼筆記 從 WM_POINTER 訊息到 Touch 事件原始碼筆記事件
- Redis基礎知識(學習筆記21--Lua 指令碼語言)Redis筆記指令碼
- 不可不知的WPF畫筆(Brush)
- WPF and Silverlight 學習筆記(十三):依賴項屬性和路由事件筆記路由事件
- LTE-5G學習筆記21--PA,PB引數理解和配置筆記
- 《從零開始學Swift》學習筆記(Day 21)——函式返回值Swift筆記函式
- Redis基礎知識(學習筆記21--Lua 指令碼語言2)Redis筆記指令碼
- [WPF]標記擴充套件(Markup Extension)套件
- WPF 筆跡演算法 從點集轉筆跡輪廓演算法
- WPF and Silverlight 學習筆記(一):開發環境及參考資料筆記開發環境
- RHCE7認證學習筆記21——使用ACLs控制檔案許可權筆記
- WPF隨筆收錄-DataGrid固定右側列
- 3月21日學習日記
- WPF LiveCharts.WpfEcharts
- 閉關21天啃透238頁筆記,成功拿下位元組跳動offer筆記