我在 WPF 中遇到了一个奇怪的边缘情况,即允许嵌套元素与属性。我有一个基本的 WPF 应用程序、一个窗口和一个默认的
App.xaml
。
MainWindow
类在后面的代码中定义了一个键:
public const string IntKey = nameof(IntKey);
和 XAML 像这样:
<Window x:Class="StaticResourceTest.MainWindow"
...namespaces etc...>
<Window.Resources>
<system:Int32 x:Key="{x:Static local:MainWindow.IntKey}">1234</system:Int32>
<DataTemplate DataType="{x:Type system:String}">
<ContentControl Content="{StaticResource {x:Static local:MainWindow.IntKey}}" />
</DataTemplate>
</Window.Resources>
<ContentControl Content="test" />
</Window>
这有效 - 窗口内容尝试显示一个字符串,DataTemplate 资源拦截它并显示另一个显示 int 的 ContentControl
1234
。
如果我将
Content
中的 DataTemplate
属性转换为嵌套元素,则会出现异常:
<DataTemplate DataType="{x:Type system:String}">
<ContentControl>
<ContentControl.Content>
<StaticResource ResourceKey="{x:Static local:MainWindow.IntKey}" />
</ContentControl.Content>
</ContentControl>
</DataTemplate>
找不到名为“System.Windows.Markup.StaticExtension”的资源。资源名称区分大小写。
如果我也转换
ResourceKey
属性:
<DataTemplate DataType="{x:Type system:String}">
<ContentControl>
<ContentControl.Content>
<StaticResource>
<StaticResource.ResourceKey>
<x:Static Member="local:MainWindow.IntKey" />
</StaticResource.ResourceKey>
</StaticResource>
</ContentControl.Content>
</ContentControl>
</DataTemplate>
它再次工作,返回到在窗口中显示
1234
。
DataTemplate
而不是隐式键控,效果相同ContentControl
位于 DataTemplate
内时才会出现此错误 - 如果我将其直接放入窗口主体中,则它在所有三种情况下都有效。为什么第一次更改会导致异常?为什么第二个让它再次消失?在我看来它们应该都是等价的。
可以使用 DynamicResource 而不是 StaticResource 来修复失败的代码。
<DataTemplate DataType="{x:Type system:String}">
<ContentControl>
<ContentControl.Content>
<DynamicResource ResourceKey="{x:Static local:MainWindow.IntKey}" />
</ContentControl.Content>
</ContentControl>
</DataTemplate>