这是问题的演示:
从一个简单的窗口:
<Window x:Class="TestWpfStaticResource.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<TextBlock Text="{StaticResource TestString}">
<TextBlock.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</TextBlock.Resources>
</TextBlock>
我正在尝试访问 ResourceDictionary 中的资源:
<ResourceDictionary
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">
<sys:String x:Key="TestString">Test</sys:String>
</ResourceDictionary>
Visual Studio 2010 显示带有预期结果的窗口,但在运行应用程序时出现此异常:
Cannot find resource named 'TestString'. Resource names are case sensitive.
注意 1:当使用 DynamicResource 时,结果在 VS 2010 和运行时都很好。
注意 2:将资源字典的引用放在 TextBlock 之外,例如在 Windows 资源中,给出了预期的结果,但我的实际情况不允许这样做。
那么,我做错了什么以及如何获得预期的结果?
回答: 经过更多测试后,XAML 解析器似乎非常小,它会按顺序解析内容,而不会尝试解释任何内容。所以声明顺序很重要:你必须把对“文本”属性的引用放在对字典的引用之后。这样做的唯一方法似乎是将对 StaticResource 的引用包装在“Binding”元素中。
提前致谢。