在WPF ResourceDictionary中,StaticResource的作用范围是什么?

13
我有一个 WPF ResourceDictionary,其中包含以下 TextBlock:
<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis}}">
</TextBlock>

ResourceDictionary包含在App.xaml中的MergedDictionaries下:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyResourceDictionary.xaml"/>

在 App.xaml 文件中,我已经定义了一个 BoolToVis 转换器(同样是在 Application.Resources 下)。

<BooleanToVisibilityConverter x:Key="BoolToVis" />

启动我的应用程序时,出现以下XamlParseException:

  

"在'System.Windows.Markup.StaticResourceHolder'上提供值时引发了异常。"

内部异常是:

  

"找不到名为“BoolToVis”的资源。资源名称区分大小写。"

我可以直接在App.xaml中引用此转换器(实际上,特定的XAML声明是相同的),并且在其他UserControl中使用也没有问题。

在.NET 4.0 RC(和Beta2)下,这段代码也能正常工作。只有当我升级到.NET 4.0 RTM后才开始出现此错误。

我可以通过在MyResourceDictionary.xaml中声明另一个BooleanToVisibilityConverter并像这样引用它来解决这个问题:

<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis2}}">
</TextBlock>

我需要这样做的原因是什么?

1个回答

9
根据MSDN的说明:
合并字典中的资源占据了资源查找范围中主资源字典之后的位置。
在App.xaml中定义的资源无法被合并的ResourceDictionary看到。我认为,在ResourceDictionary本身或另一个包含所有转换器的ResourceDictionary中定义在ResourceDictionary中使用的转换器更有意义。

1
我们可能会选择第二条路。奇怪的是,这段代码在 RC 版本中运行得很好,但在 RTM 版本中却不行。我们的开发团队在使用哪个版本方面“混乱不堪”。作为早期采用者,我运气不太好 :)。 - Nicolas Webb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接