【问题标题】:What is the scope of StaticResource within a WPF ResourceDictionary?WPF ResourceDictionary 中 StaticResource 的范围是什么?
【发布时间】:2011-02-10 08:32:42
【问题描述】:

我有一个带有以下 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 声明是相同的)和其他 UserControls 中没有问题。

这段特殊的代码在 .NET 4.0 RC(和 Beta2)下也能正常工作。此错误仅在我升级到 .NET 4.0 RTM 时才开始发生。

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

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

我为什么需要这样做?

【问题讨论】:

    标签: wpf .net-4.0 resourcedictionary


    【解决方案1】:

    每MSDN:

    合并字典中的资源在资源查找范围中占据一个位置,该位置位于它们合并到的主资源字典范围之后。

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

    【讨论】:

    • 我们可能会采取第二条路线。奇怪的是,这段代码在 RC 中运行得很好,但在 RTM 中却没有。我们的开发团队对于谁拥有什么版本是“混合的”。作为一个早期采用者,我画出了短稻草:)。谢谢!
    猜你喜欢
    • 2010-09-17
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2020-10-18
    • 2017-04-22
    相关资源
    最近更新 更多