大家好,又见面了,我是你们的朋友全栈君。
WPF介绍了一个非常方便的概念:把数据储存为一种资源,无论是本地控件、本地窗口还是全局应用。数据可以是任何你想要的东西,从实际的信息到WPF控件的层次结构都行。这非常有用,你可以把数据放在一个地方,然后在其他地方调用它。
这个概念被广泛用在样式和模版,我们后面会详细讲到。也可以用在很多别的地方,就像本章要说明的地方,例子如下:
<span style="font-size:14px;"><Window x:Class="WpfTutorialSamples.WPF_Application.ResourceSample"
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="ResourceSample" Height="150" Width="350">
<Window.Resources>
<sys:String x:Key="strHelloWorld">Hello, world!</sys:String>
</Window.Resources>
<StackPanel Margin="10">
<TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
<TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
</StackPanel>
</Window></span>
资源使用x:Key属性来定义一个关键字,使用该关键字,就可以从应用的其他地方来引用了。你需要用到StaticResource这个标记扩展符。在上面的例子中,我定义了一个简单的字符串(Hello,world!),然后在两个不同的文本块里面进行引用。
StaticResource与DynamicResource
<span style="font-size:14px;"><Window x:Class="WpfTutorialSamples.WPF_Application.ExtendedResourceSample"
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="ExtendedResourceSample" Height="160" Width="300"
Background="{DynamicResource WindowBackgroundBrush}">
<Window.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
<x:Array x:Key="ComboBoxItems" Type="sys:String">
<sys:String>Item #1</sys:String>
<sys:String>Item #2</sys:String>
<sys:String>Item #3</sys:String>
</x:Array>
<LinearGradientBrush x:Key="WindowBackgroundBrush">
<GradientStop Offset="0" Color="Silver"/>
<GradientStop Offset="1" Color="Gray"/>
</LinearGradientBrush>
</Window.Resources>
<StackPanel Margin="10">
<Label Content="{StaticResource ComboBoxTitle}" />
<ComboBox ItemsSource="{StaticResource ComboBoxItems}" />
</StackPanel>
</Window></span>
这次我们添加了一组额外的资源,窗体包含了一个简单的字符串,一个字符串数组和一个渐变画刷。字符串用于标签,数组用于下拉组合框,画刷用于整个窗口的背景。就像这样很多东西都可被存为资源。
<span style="font-size:14px;"><StackPanel Margin="10"> <StackPanel.Resources> <sys:String x:Key="ComboBoxTitle">Items:</sys:String> </StackPanel.Resources> <Label Content="{StaticResource ComboBoxTitle}" /></StackPanel></span>
上面的例子中,我们把资源添加到StackPanel控件里面,并用到子控件Label。只要是在StackPanel里的子控件都可以使用这个资源,而在StackPanel外面的控件则无法使用这个资源。
<span style="font-size:14px;"><Application x:Class="WpfTutorialSamples.App" 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" StartupUri="WPF application/ExtendedResourceSample.xaml"> <Application.Resources> <sys:String x:Key="ComboBoxTitle">Items:</sys:String> </Application.Resources></Application></span>
WPF自动逐级向上搜索,从本地控件到整个窗口,再到App.xaml,来找到这个资源。
<span style="font-size:14px;"><Label Content="{StaticResource ComboBoxTitle}" /></span>
后台代码的资源
我们通过一个标记扩展,访问了XAML的所有资源。同样的,你也可以从后台代码访问各种资源,在某些场景下非常有用。前面的例子我们把资源放在不同的地方,因此接下来的例子,我们将资源放在在三个不同的范畴,然后在后台代码访问它们。
<span style="font-size:14px;"><Application x:Class="WpfTutorialSamples.App" 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" StartupUri="WPF application/ResourcesFromCodeBehindSample.xaml"> <Application.Resources> <sys:String x:Key="strApp">Hello, Application world!</sys:String> </Application.Resources></Application></span>
Window:
<span style="font-size:14px;"><Window x:Class="WpfTutorialSamples.WPF_Application.ResourcesFromCodeBehindSample" 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="ResourcesFromCodeBehindSample" Height="175" Width="250"> <Window.Resources> <sys:String x:Key="strWindow">Hello, Window world!</sys:String> </Window.Resources> <DockPanel Margin="10" Name="pnlMain"> <DockPanel.Resources> <sys:String x:Key="strPanel">Hello, Panel world!</sys:String> </DockPanel.Resources> <WrapPanel DockPanel.Dock="Top" HorizontalAlignment="Center" Margin="10"> <Button Name="btnClickMe" Click="btnClickMe_Click">Click me!</Button> </WrapPanel> <ListBox Name="lbResult" /> </DockPanel></Window></span>
Code-behind:
<span style="font-size:14px;">using System;using System.Windows;namespace WpfTutorialSamples.WPF_Application{ public partial class ResourcesFromCodeBehindSample : Window { public ResourcesFromCodeBehindSample() { InitializeComponent(); } private void btnClickMe_Click(object sender, RoutedEventArgs e) { lbResult.Items.Add(pnlMain.FindResource("strPanel").ToString()); lbResult.Items.Add(this.FindResource("strWindow").ToString()); lbResult.Items.Add(Application.Current.FindResource("strApp").ToString()); } }}</span>
我们将 “Hello, world!” 放在三个不同的地方:App.xaml、窗口内部、本地panel。界面包含一个按钮和一个listbox。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128365.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...