程式碼隱藏的資源

在這個例子中,我們將從程式碼隱藏中訪問三個不同的資源,每個資源都儲存在不同的範圍內

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() 方法。所有這三種情況,因為如果沒有找到,它將一直持續到視窗,然後到達應用程式級別。

反之亦然 - 搜尋不會向下導航樹,因此如果已在本地為控制元件或視窗定義資源,則無法在應用程式級別上查詢資源。