c# - 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());
}
}
}
我究竟做错了什么?坦克一个这么多的回答。
保罗
解决方案
如评论中所述,您在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
推荐阅读
- mysql - 返回子查询中的最后一条记录 - MySQL
- flutter - 文本未显示我发送给它的变量
- tableau-api - 如何基于最小日期进行聚合,但仅在对所有日期应用维度过滤器之后?
- python - 如果仅句子包含搜索列表中的任何关键字,则从数据框文本列中选择句子
- wordpress - Wordpress 编辑页面页面构建器移到一边
- node.js - 使用 azure ad nodeJS SAML 实现 SSO
- angular - Angular BehaviorSubject 已延迟更新到前端
- osmnx - 如何在 OSMNX 中为路线的各个边缘指定颜色?
- sql - SQL 到具有当前表的 UNION 历史表(日期范围对齐)
- angular - 返回 oauth 客户端和 IdentityServer4 的 url 编码问题