代码隐藏的资源
在这个例子中,我们将从代码隐藏中访问三个不同的资源,每个资源都存储在不同的范围内
App.xaml 中:
<Application x:Class="WpfSamples.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="WPFApplication/ResourcesFromCodeBehindSample.xaml">
<Application.Resources>
<sys:String x:Key="strApp">Hello, Application world!</sys:String>
</Application.Resources>
</Application>
窗口:
<Window x:Class="WpfSamples.WPFApplication.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>
代码隐藏:
using System;
using System.Windows;
namespace WpfSamples.WPFApplication
{
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());
}
}
}
所以,正如你所看到的,我们存储了三个不同的 Hello World!
消息:一个在 App.xaml 中,一个在窗口内,一个在本地用于主面板。界面由一个按钮和一个 ListBox 组成。
在 Code-behind 中,我们处理按钮的 click 事件,我们将每个文本字符串添加到 ListBox,如屏幕截图所示。我们使用 FindResource()
方法,该方法将资源作为对象(如果找到)返回,然后我们通过使用 ToString()
方法将其转换为我们知道的字符串。
注意我们如何在不同的范围上使用 FindResource()
方法 - 首先在面板上,然后在窗口上,然后在当前的 Application 对象上。查找我们所知道的资源是有意义的,但正如已经提到的,如果找不到资源,搜索会在层次结构中向上进行,所以原则上我们可以在面板上使用 FindResource()
方法。所有这三种情况,因为如果没有找到,它将一直持续到窗口,然后到达应用程序级别。
反之亦然 - 搜索不会向下导航树,因此如果已在本地为控件或窗口定义资源,则无法在应用程序级别上查找资源。