宇宙很大,生活更大,也許以后還有緣相見(jiàn)。 --三體 ??
?? 該篇作為[WPF 入門筆記 - 04 - 數(shù)據(jù)綁定] - Additional Content 章節(jié)的補(bǔ)充內(nèi)容
前言
- XAML 資源概述 (WPF .NET)
WPF中的每一個(gè)元素都有一個(gè)Resources
屬性,該屬性存儲(chǔ)了一個(gè)資源字典集合。一般來(lái)說(shuō),可以把WPF的資源按照不同的性質(zhì)分為兩種 - 程序集資源(Assembly Resources)和邏輯資源(Logical Resources):
-
程序集資源(Assembly Resources)或二進(jìn)制資源(Binary Resources): MSDN稱其為應(yīng)用資源,這些資源通常是嵌入在應(yīng)用程序的程序集中的文件,例如圖像、音頻、視頻等。它們被視為應(yīng)用程序的一部分,并且在運(yùn)行時(shí)作為二進(jìn)制數(shù)據(jù)進(jìn)行訪問(wèn)??梢允褂?code>Pack URI或
Relative URI
來(lái)引用這些資源。 -
邏輯資源(Logical Resources)或?qū)ο筚Y源(Object Resources): MSDN稱其為XAML 資源,這些資源是在XAML中定義的,用于表示控件樣式、模板、數(shù)據(jù)對(duì)象等。它們通過(guò)鍵值對(duì)的形式進(jìn)行定義,并在應(yīng)用程序中以邏輯方式進(jìn)行引用和使用。邏輯資源可以在XAML或代碼中進(jìn)行定義,并且可以在整個(gè)應(yīng)用程序中進(jìn)行共享和重用。[ 盡管可以在代碼中創(chuàng)建和操作資源,但通常在
XAML
中定義 ]
應(yīng)用資源
又稱程序集資源或二進(jìn)制資源,是指嵌入在應(yīng)用程序的程序集中的文件或數(shù)據(jù)。這些資源在編譯時(shí)被包含在應(yīng)用程序的可執(zhí)行文件或程序集中,并以二進(jìn)制形式存儲(chǔ)。以圖片為例,假設(shè)在Image
文件夾下有張名為test.jpg
的圖片:
訪問(wèn)位于項(xiàng)目文件夾中的圖片文件的寫法有很多,寫幾個(gè)我會(huì)的:
<Window x:Class="WPFDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="730"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Grid>
<StackPanel>
<Image Name="Image1" Height="150" Source="E:\WPF\WPFDemo\WPFDemo\Image\test.jpg" />
<Image Name="Image2" Source="Image/test.jpg" />
<Image Name="Image3" Height="150" Source="pack://application:,,,/image/test.jpg" />
</StackPanel>
</Grid>
</Window>
從上到下 - Image1
:絕對(duì)路徑 - Image2
:相對(duì)路徑 - Image3
:將圖片文件添加到項(xiàng)目的資源文件夾中,然后使用Pack URI
來(lái)引用程序集資源,還有其他的大家自己研究吧:
XAML 資源
又稱邏輯資源,它是一些保存在元素Resources
屬性中的.NET
對(duì)象,可以是各種類型的對(duì)象,如顏色、樣式、數(shù)據(jù)模板、控件等也可以是一般的.NET
對(duì)象,可以通過(guò)鍵(Key)來(lái)標(biāo)識(shí)資源,以StaticResource
或者DynamicResource
的方式來(lái)引用資源,具體取決于相應(yīng)的應(yīng)用場(chǎng)景。
<Window x:Class="WPFDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="MainWindow"
Width="800"
Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Window.Resources>
<SolidColorBrush x:Key="BrushColor" Color="OrangeRed" />
<system:String x:Key="MyStringResource">Hello, WPF!</system:String>
</Window.Resources>
<Grid>
<StackPanel>
<Button BorderBrush="{DynamicResource BrushColor}" BorderThickness="3" Content="在Button內(nèi)定義資源">
<Button.Resources>
<SolidColorBrush x:Key="BrushColor" Color="HotPink" />
</Button.Resources>
</Button>
<Button Margin="5" BorderBrush="{StaticResource BrushColor}" BorderThickness="3"
Content="在窗體內(nèi)定義資源" />
<TextBlock HorizontalAlignment="Center" FontSize="15" Text="{StaticResource MyStringResource}" />
</StackPanel>
</Grid>
</Window>
在
Button
內(nèi)定義資源時(shí),應(yīng)該使用DynamicResource
來(lái)引用資源。
資源分級(jí)
資源可以按照不同的級(jí)別進(jìn)行分級(jí),例如:
系統(tǒng)資源,一般會(huì)在app.xaml
中集成:
窗體資源,上面例子中的Window.Resources
:
控件資源,上面例子中的Button.Resources
:
......
靜態(tài)資源和動(dòng)態(tài)資源
靜態(tài)資源(StaticResource)和動(dòng)態(tài)資源(DynamicResource)是 WPF 中用于資源綁定的兩種不同方式。
- 靜態(tài)資源(StaticResource):
- 靜態(tài)資源是在
XAML
中定義并在編譯時(shí)解析的。 - 一旦靜態(tài)資源被解析并應(yīng)用于目標(biāo)元素,它們的值將保持不變,不會(huì)隨后續(xù)的資源更改而自動(dòng)更新。
- 靜態(tài)資源適用于在應(yīng)用程序的生命周期內(nèi)保持不變的資源,如樣式、模板、圖像等。
- 由于靜態(tài)資源在解析時(shí)進(jìn)行了性能優(yōu)化,因此在性能要求較高的情況下,靜態(tài)資源是一個(gè)更好的選擇。
- 靜態(tài)資源是在
- 動(dòng)態(tài)資源(DynamicResource):
- 動(dòng)態(tài)資源是在運(yùn)行時(shí)進(jìn)行解析和更新的。
- 動(dòng)態(tài)資源允許在應(yīng)用程序運(yùn)行時(shí)更改資源的值,并自動(dòng)更新所有使用該資源的目標(biāo)元素。
- 動(dòng)態(tài)資源適用于需要?jiǎng)討B(tài)更改的資源,如主題、樣式、語(yǔ)言切換等。
- 由于動(dòng)態(tài)資源需要在運(yùn)行時(shí)進(jìn)行解析和更新,因此在性能方面可能會(huì)比靜態(tài)資源稍差。
寫個(gè)示例看一下具體區(qū)別:
<Window x:Class="WPFDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Window.Resources>
<SolidColorBrush x:Key="BrushColor" Color="HotPink" />
</Window.Resources>
<Grid>
<StackPanel>
<Button Margin="5"
BorderBrush="{StaticResource BrushColor}"
BorderThickness="3"
Content="靜態(tài)資源" />
<Button Margin="5" Click="Button_Click" Content="修改邊框顏色" />
<Button Margin="5"
BorderBrush="{DynamicResource BrushColor}"
BorderThickness="3"
Content="動(dòng)態(tài)資源" />
</StackPanel>
</Grid>
</Window>
兩個(gè)按鈕,分別使用靜態(tài)資源和動(dòng)態(tài)資源的方法設(shè)置邊框顏色,通過(guò)點(diǎn)擊事件修改資源中的邊框顏色:
private void Button_Click(object sender, RoutedEventArgs e)
{
SolidColorBrush colorBrush = new SolidColorBrush(Colors.BlueViolet);
this.Resources["BrushColor"] = colorBrush;
}
運(yùn)行程序你會(huì)發(fā)現(xiàn),點(diǎn)擊修改邊框顏色按鈕后,之后使用動(dòng)態(tài)資源的按鈕才會(huì)對(duì)資源的變動(dòng)做出反應(yīng):
由此可以大致知道兩者的應(yīng)用場(chǎng)景:
- 靜態(tài)資源適用于在應(yīng)用程序啟動(dòng)時(shí)確定并保持不變的資源。例如,全局樣式、應(yīng)用程序圖標(biāo)等。
- 動(dòng)態(tài)資源適用于需要根據(jù)用戶交互或其他條件動(dòng)態(tài)更改的資源。例如,切換主題、更改語(yǔ)言、動(dòng)態(tài)樣式等。
資源字典
資源字典(Resource Dictionary):一種用于組織和管理資源的集合。
在前面中有提到,每個(gè)Resources
屬性存儲(chǔ)著一個(gè)資源字典集合。如果希望在多個(gè)項(xiàng)目之間共享資源的話,就可以使用資源字典。使用資源字典可以將資源集中管理,提高代碼的可維護(hù)性和重用性。
創(chuàng)建資源字典就很簡(jiǎn)單了,Ctrl + Shift + A
:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="DefaultButtonStyle" TargetType="Button">
<Setter Property="Margin" Value="5" />
<Setter Property="BorderBrush" Value="HotPink" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="Content" Value="Otto" />
<Setter Property="FontSize" Value="12" />
</Style>
</ResourceDictionary>
想要使用這個(gè)資源字典的話,首先需要將其合并到應(yīng)用程序中資源集合位置,當(dāng)然你也可以合并到窗口資源集合中,但是通常是合并到應(yīng)用程序資源集合中,因?yàn)橘Y源字典的目的就是在于多個(gè)窗體中共享,具體的XAML
代碼如下所示:
<Application x:Class="SwitchThemeDemo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SwitchThemeDemo"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DictionaryButtonStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
回到頁(yè)面我們聲明幾個(gè)使用DictionaryButtonStyle.xaml
中樣式的按鈕:
<Window x:Class="SwitchThemeDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SwitchThemeDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Grid>
<StackPanel>
<Button Style="{StaticResource DefaultButtonStyle}"/>
<Button Style="{StaticResource DefaultButtonStyle}"/>
<Button Style="{StaticResource DefaultButtonStyle}"/>
<Button Style="{StaticResource DefaultButtonStyle}"/>
</StackPanel>
</Grid>
</Window>
可以看到幾個(gè)按鈕都是和樣式里定義是一樣的,同時(shí)在別的窗口或者頁(yè)面也是可以使用字典中的樣式的。
由此可見(jiàn),資源字典是一種強(qiáng)大的工具,可以幫助管理和組織應(yīng)用程序中的各種資源,提高代碼的可重用性、可維護(hù)性和一致性,同時(shí)還允許動(dòng)態(tài)更新和定制化。使用資源字典具有以下好處:
- 代碼重用:資源字典允許在應(yīng)用程序的多個(gè)地方定義和使用相同的資源。這樣可以避免重復(fù)編寫相同的代碼,提高代碼的重用性和可維護(hù)性。
- 統(tǒng)一的外觀和樣式:通過(guò)將樣式、模板、顏色和其他外觀相關(guān)的資源放在資源字典中,可以輕松地對(duì)整個(gè)應(yīng)用程序的外觀進(jìn)行統(tǒng)一和集中管理。這樣可以確保應(yīng)用程序的各個(gè)部分都具有一致的外觀和樣式。
- 資源共享:資源字典允許在應(yīng)用程序的不同部分共享資源。這意味著您可以在不同的頁(yè)面、窗口或控件中引用和使用相同的資源,以實(shí)現(xiàn)一致性和統(tǒng)一性。
- 動(dòng)態(tài)更新:資源字典中的資源可以動(dòng)態(tài)更新。當(dāng)修改資源字典中的資源時(shí),引用了該資源的控件會(huì)自動(dòng)更新其外觀和行為,而無(wú)需手動(dòng)修改每個(gè)控件。
- 可擴(kuò)展性:資源字典可以很容易地進(jìn)行擴(kuò)展和定制。可以在已有的資源字典基礎(chǔ)上添加新的資源,或者創(chuàng)建自己的自定義資源字典,并將其與應(yīng)用程序中的其他資源字典進(jìn)行組合和使用。
查找資源
在WPF中,可以使用以下幾種方法通過(guò)后臺(tái)代碼查找資源:
-
使用
FindResource
方法:這是一種常用的方法,通過(guò)調(diào)用控件或應(yīng)用程序的FindResource
方法來(lái)查找資源。該方法會(huì)在當(dāng)前元素及其父級(jí)元素的資源字典中進(jìn)行查找,并返回找到的資源對(duì)象。例如:var resource = this.FindResource("ResourceKey");
-
使用
TryFindResource
方法:與FindResource
方法類似,但是TryFindResource
方法不會(huì)拋出異常,而是返回一個(gè)布爾值表示是否找到了資源。這樣可以更容易地處理資源查找失敗的情況。例如:bool found = this.TryFindResource("ResourceKey", out var resource);
-
使用
Resources
屬性:每個(gè)FrameworkElement
都有一個(gè)Resources
屬性,該屬性是一個(gè)ResourceDictionary
對(duì)象,它包含了該元素的資源字典??梢酝ㄟ^(guò)訪問(wèn)該屬性來(lái)查找資源。例如:var resource = this.Resources["ResourceKey"];
-
使用
Application.Current.Resources
:可以通過(guò)訪問(wèn)Application.Current.Resources
屬性來(lái)查找應(yīng)用程序級(jí)別的資源。這個(gè)屬性返回一個(gè)ResourceDictionary
對(duì)象,其中包含了整個(gè)應(yīng)用程序的資源。例如:var resource = Application.Current.Resources["ResourceKey"];
以上就是本文的全部?jī)?nèi)容了,主要介紹了WPF中的兩大類資源:應(yīng)用資源和XAML
資源以及在使用資源時(shí)通過(guò)靜態(tài)資源引用和使用動(dòng)態(tài)資源引用的區(qū)別,需要根據(jù)具體場(chǎng)景調(diào)整。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-501188.html
本文是學(xué)習(xí)WPF所作筆記,難免有理解不對(duì)的地方,歡迎留言討論!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-501188.html
到了這里,關(guān)于WPF 入門筆記 - 04 - 數(shù)據(jù)綁定 - 補(bǔ)充內(nèi)容:資源基礎(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!