代码之家  ›  专栏  ›  技术社区  ›  Nicolas Webb

wpf资源字典中staticresource的作用域是什么?

  •  12
  • Nicolas Webb  · 技术社区  · 15 年前

    我有一个带有以下文本块的wpf resourcedictionary:

    <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' 引发了异常。“

    InnerException是:

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

    我可以用app.xaml直接引用这个转换器(事实上,特定的xaml声明是相同的)并且在其他用户控件中没有问题。

    在.net 4.0rc(和beta2)下,这个特殊的代码位也工作得很好。此错误仅在我升级到.NET 4.0 RTM时发生。

    我可以通过声明另一个 BooleanToVisibilityConverter 在myresourcedictionary.xaml中,并按如下方式引用它:

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

    我为什么要这么做?

    1 回复  |  直到 15 年前
        1
  •  8
  •   David    15 年前

    MSDN :

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

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