代码隐藏的资源

在这个例子中,我们将从代码隐藏中访问三个不同的资源,每个资源都存储在不同的范围内

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());
                }
        }
}

StackOverflow 文档

所以,正如你所看到的,我们存储了三个不同的 Hello World! 消息:一个在 App.xaml 中,一个在窗口内,一个在本地用于主面板。界面由一个按钮和一个 ListBox 组成。

在 Code-behind 中,我们处理按钮的 click 事件,我们将每个文本字符串添加到 ListBox,如屏幕截图所示。我们使用 FindResource() 方法,该方法将资源作为对象(如果找到)返回,然后我们通过使用 ToString() 方法将其转换为我们知道的字符串。

注意我们如何在不同的范围上使用 FindResource() 方法 - 首先在面板上,然后在窗口上,然后在当前的 Application 对象上。查找我们所知道的资源是有意义的,但正如已经提到的,如果找不到资源,搜索会在层次结构中向上进行,所以原则上我们可以在面板上使用 FindResource() 方法。所有这三种情况,因为如果没有找到,它将一直持续到窗口,然后到达应用程序级别。

反之亦然 - 搜索不会向下导航树,因此如果已在本地为控件或窗口定义资源,则无法在应用程序级别上查找资源。