13

次の 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 にアップグレードしたときにのみ発生し始めました。

BooleanToVisibilityConverterMyResourceDictionary.xaml 内で別のものを宣言し、次のように参照することで回避できます。

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

これを行う必要がある理由は何ですか?

4

1 に答える 1

9

MSDNごと:

マージされたディクショナリ内のリソースは、マージ先のメイン リソース ディクショナリのスコープの直後にあるリソース ルックアップ スコープ内の場所を占有します。

App.xaml で定義されたリソースは、マージされた ResourceDictionary からは見えません。ResourceDictionary 自体の ResourceDictionary で使用されるコンバーターを定義するか、すべてのコンバーターを収容する別の ResourceDictionary を定義する方が理にかなっていると思います。

于 2010-04-20T22:47:30.387 に答える