首页 > 解决方案 > C# WPF .NET 5.0 中的 FindResource()

问题描述

我是 C# 和 WPF 的新手。所以我正在尝试完成一个教程(https://www.wpf-tutorial.com/wpf-application/resources/)。

关于资源,他们说:

“请注意我们如何在不同范围内使用 FindResource() 方法 - 首先在面板上,然后在窗口上,然后在当前 Application 对象上。寻找我们知道的资源是有意义的,但如前所述,如果找不到资源,则搜索会沿层次结构向上进行,因此原则上,我们可以在所有三种情况下都使用面板上的 FindResource() 方法,因为它会一直持续到窗口,然后再到应用程序级别,如果没有找到。”

但在我的系统上,它不起作用!(TryFindResource()返回空值)。

这是我的代码:

<Window x:Class="_03_ResourcesFromCodeBehindSample.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:_03_ResourcesFromCodeBehindSample"
        mc:Ignorable="d"
        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" Margin="10" Click="btnClickMe_Click">Funktioniert!</Button>
            <Button Name="btnAbsturz" Margin="10" Click="btnAbsturz_Click">Stürzt ab!</Button>
        </WrapPanel>
        <ListBox Name="lstBox" />
    </DockPanel>
</Window>

<Application x:Class="_03_ResourcesFromCodeBehindSample.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"
             xmlns:local="clr-namespace:_03_ResourcesFromCodeBehindSample"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <sys:String x:Key="strApp">Hello, Application world!</sys:String>
    </Application.Resources>
</Application>

我的代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace _03_ResourcesFromCodeBehindSample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnClickMe_Click(object sender, RoutedEventArgs e)
        {
            lstBox.Items.Add(pnlMain.FindResource("strPanel").ToString());
            lstBox.Items.Add(this.FindResource("strWindow").ToString());
          lstBox.Items.Add(Application.Current.FindResource("strApp").ToString());
        }

        private void btnAbsturz_Click(object sender, RoutedEventArgs e)
        { /* Das folgende stürzt ab! Warum, weiss ich noch nicht.
             Gemäss Dokumentation sollte das doch funktionieren!
           */

            lstBox.Items.Add(FindResource("strPanel").ToString());
            lstBox.Items.Add(FindResource("strWindow").ToString());
            lstBox.Items.Add(FindResource("strApp").ToString());
        }
    }
}

我究竟做错了什么?坦克一个这么多的回答。

保罗

标签: c#wpf

解决方案


如评论中所述,您在btnAbsturz_Click()方法中的代码是 using FindResource(),而不是pnlMain.FindResource(). 在 C# 中,该FindResource()方法的前缀是秘密的this,将其转换为this.FindResource(). 这就是为什么您的第一个电话失败的原因。

如果您将该方法的主体替换为

private void btnAbsturz_Click(object sender, RoutedEventArgs e)
{    
    lstBox.Items.Add(pnlMain.FindResource("strPanel").ToString());
    lstBox.Items.Add(pnlMain.FindResource("strWindow").ToString());
    lstBox.Items.Add(pnlMain.FindResource("strApp").ToString());
}

它应该按预期工作。

有关此关键字的更多信息,请参见此处:https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/this


推荐阅读