2011-01-31 31 views
4

私はWPF UserControlsのライブラリと、ライブラリ内で共有されているResourceDictionaryを持っています。UserControlで親のResourceDictionaryを参照する

このライブラリのすべてのUserControlは、実際には小さなコントロールのコレクションの単なるコンテナである単一の「シェル」親コントロール内にのみ表示されます。私は「シェル」コントロール内に座る子コントロールからのResourceDictionaryにアクセスすることはできませんが、以下のXAML

<Control.Resources> 
    <ResourceDictionary Source="MyResources.xaml" /> 
</Control.Resources> 

を追加すると、期待どおり、私は私のシェルコントロールからのResourceDictionaryにアクセスすることができますよ。

私は、WPFがリソースをローカルにチェックし、適切なリソースが見つかるまで上方に移動する必要があるという印象を受けましたか?

代わりに、私はもちろん、私は(と思います)私の子コントロールでのResourceDictionaryを参照することができます

Cannot find resource named '{BoolInverterConverter}'. 
Resource names are case sensitive. Error at  
    object 'System.Windows.Data.Binding' in markup file... 

を取得しています。それぞれのコントロールは今この辞書を参照する必要があり、これは必要ではないと私は信じていました。

私は何か奇妙なことをやっているのですか、または行動の誤った予想ですか?

答えて

4

ドキュメントは少し不透明ですが、何が起きているのかはhereと記載されています。キーを指定せずに要素のResourcesプロパティにResourceDictionaryを追加すると、WPFはリソースディクショナリ内でマージしていると予想し、その辞書の内容をそのMergedDictionariesプロパティに代入します。キーのないResourceDictionaryの実際の内容は無視されます。

それでは、あなたがやりたいことはこれです:

<Control.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="MyResources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Control.Resources> 

編集:

作業例:

MainWindow.xaml:

<Window x:Class="MergedDictionariesDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MergedDictionariesDemo="clr-namespace:MergedDictionariesDemo" Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Dictionary1.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <MergedDictionariesDemo:UserControl1 /> 
    </Grid> 
</Window> 

Dictionary1.xaml :

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <SolidColorBrush x:Key="UCBrush" 
        Color="Bisque" /> 
</ResourceDictionary> 

UserControl1.xaml:

<UserControl x:Class="MergedDictionariesDemo.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Border Margin="10" BorderBrush="Navy" BorderThickness="1" CornerRadius="10"> 
     <TextBlock Margin="10" 
        Background="{DynamicResource UCBrush}"> 
      The background of this is set by the resource UCBrush. 
     </TextBlock> 

    </Border> 
</UserControl> 
+0

あなたの答えをありがとう。残念ながら、これは私の元のXAMLと同じ「Can not find resource ...」結果を与えます。私はキーを使用して実験していますが、何の成功も見いだせません。ドキュメントリンクのどの部分が何が起こっているのかを説明しています。私はそれを読んで、ResourceDictionariesに関連している間は、リソースがコントロールの階層内で利用可能かどうかについて特に何も見ていませんでした。 –

+1

「ResourceDictionaryにx:Keyディレクティブがないことに注意してください」という冒頭の段落の段落にあります。「StaticResource」マークアップ拡張を使用してリソースを取得しようとしていますか?それはうまくいかないからです。 'DynamicResource'が行います。 –

+0

Robert - 私はあなたのソリューションを見ていました。たとえDynamicResourceを使用していても、コンパイラは「リソース」というコンパイル時エラーをスローします。リソースxxxは解決できません。上のコードでも同じことができます。何かご意見は? – Patrick