假设我有一个显示UserControl的窗口。 UserControl包含一个TextBox,它需要引用Window.Resources中定义的命名样式:
<Window.Resources>
<Style TargetType="TextBlock" x:Key="myStyle">
<Setter Property="FontSize" Value="20" />
</Style>
</Window.Resources>
如果我这样做:
<TextBlock Style="{StaticResource myStyle}">Hello</TextBlock>
运行应用程序时,将抛出XamlParseException异常(&#39;提供值&System;对于引发异常。&#39;)。
如果我将引用更改为DynamicResource,一切正常:
<TextBlock Style="{DynamicResource myStyle}">Hello</TextBlock>
StaticResource引用是否会失败,因为UserControl的XAML在包含它的Window之前被词法解析?换句话说,就XAML解析器而言,是否在UserControl之后定义了Windows.Resource?
谢谢!
本
答案 0 :(得分:0)
是的,这是正确的 - XAML解析器在使用StaticResource标记扩展时可以找到的内容非常有限。它不是关于订单 - 每个XAML文件几乎都是它自己的范围,如果它们在不同的文件中则无法看到其他资源。正如您所指出的,您可以使用DynamicResource。如果您想要StaticResource的好处(特别是设计时支持),您还可以在资源中合并字典(http://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.mergeddictionaries.aspx)用户控件的字典,以便将XAML解析器提供给它应该考虑的其他资源“范围”。
我认为合并字典可能在这种特殊情况下不起作用,因为我怀疑如果你将父作用域合并到子资源字典中,你可能会得到一个重复的定义错误(我没有为这个特定的情况测试它,也许XAML干净地覆盖。)