7

次の非常に再現しやすい問題があります。別のファイルのリソースを使用する xaml アプリケーションを作成しています。次のように、MergedDictionaries タグを作成して、ローカル リソースとグローバル リソースをマージします。

<Window>
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="path.to.xaml.file"/>
            <ResourceDictionary>
                <Style TargetType="{x:Type Border}" x:Key="TypeBlock">

                </Style>
                <Style TargetType="{x:Type Border}" x:Key="SetBlock">

                </Style>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
....
</Window>

この小さなコードを実行すると、クラッシュします。

Item has already been added. Key in dictionary: 'System.Windows.Controls.Border'  Key being added: 'System.Windows.Controls.Border'

MergedDictionaries タグを削除すると、コードは期待どおりに実行されます。

<Window>
<Window.Resources>
    <Style TargetType="{x:Type Border}" x:Key="TypeBlock">

    </Style>
    <Style TargetType="{x:Type Border}" x:Key="SetBlock">

    </Style>
</Window.Resources>
</Window>

マージされたリソースを使用すると、例外がスローされる理由がわかりません。もちろん、今のところ修正は簡単です (リソースを下位レベルに移動します)。これが「通常の」動作であるかどうかを知っておくとよいでしょう...

4

1 に答える 1

11

リソースが別のファイルに配置されていない場合、それらはマージされた辞書の一部であってはなりません。次のように外側に移動します。

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="path.to.xaml.file"/>
        </ResourceDictionary.MergedDictionaries>

        <Style TargetType="{x:Type Border}" x:Key="TypeBlock">

        </Style>
        <Style TargetType="{x:Type Border}" x:Key="SetBlock">

        </Style>
    </ResourceDictionary>
</Window.Resources>

とはいえ、エラー メッセージは少し誤解を招きやすく、XAML コンパイラのバグが原因である可能性があります。

于 2010-01-11T09:42:45.877 に答える