WPF ResourceDictionary中StaticResource的范围是什么?

时间:2010-04-20 21:44:21

标签: wpf .net-4.0 resourcedictionary

我有一个带有以下TextBlock的WPF ResourceDictionary:

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

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

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

在App.xaml中,我定义了BoolToVis转换器(同样,在Application.Resources下)

<BooleanToVisibilityConverter x:Key="BoolToVis" />

当我启动我的应用程序时 - 我得到以下XamlParseException:

  

“提供价值   'System.Windows.Markup.StaticResourceHolder'   抛出一个例外。“

InnerException是:

  

“找不到名为'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 个答案:

答案 0 :(得分:8)

MSDN

  

合并字典中的资源占用资源查找范围中的位置,该位置恰好位于它们合并到的主资源字典的范围之后。

合并后的ResourceDictionary无法看到App.xaml中定义的资源。我认为在ResourceDictionary本身中定义ResourceDictionary中使用的转换器或者包含所有转换器的另一个ResourceDictionary更有意义。