2012-03-02 15 views
0

UserControlを表示しているウィンドウがあるとします。 System.Windows.StaticResourceExtension「に価値を提供します」(字句解析ウィンドウの順序 - > UserControl

<TextBlock Style="{StaticResource myStyle}">Hello</TextBlock> 

XamlParseException例外:

<Window.Resources> 
    <Style TargetType="TextBlock" x:Key="myStyle"> 
     <Setter Property="FontSize" Value="20" /> 
    </Style> 
</Window.Resources> 

私が行う場合:ユーザーコントロールは、Window.Resourcesで定義された名前のスタイルを参照する必要があるテキストボックスが含まれています'例外がスローされました。')がアプリケーションの実行時にスローされます。

私はDynamicResourceへの参照を変更すると、すべてが正常に動作します:UserControlのXAMLは、辞書的にそれが含まれているウィンドウの前に解析されているので

<TextBlock Style="{DynamicResource myStyle}">Hello</TextBlock> 

はStaticResource参照が失敗していますか?言い換えれば、XAMLパーサーに関する限り、Windows.ResourcesはUserControlの後に定義されていますか?

ありがとうございます!
Ben

答えて

0

はい、正しいことです.XAMLパーサーは、StaticResourceマークアップ拡張で検索できるものが非常に限られています。 XAMLファイルはそれぞれ独自のスコープであり、異なるファイルにある場合は他のリソースを見ることができません。あなたが指摘しているように、代わりにDynamicResourceを使用することができます。 StaticResourceの利点(特に設計時のサポート)が必要な場合は、辞書(http://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.mergeddictionaries.aspx)をリソースにマージすることもできますユーザーコントロールの辞書を使用して、XAMLパーサーを考慮する必要がある追加のリソース「スコープ」に配置します。

私はあなたが子のリソース辞書に親スコープをマージすると疑うので、この特定のケースではマージディクショナリが動作しないかもしれないと思う、重複した定義エラーが出るかもしれない(私はこの特定のケースXAMLはきれいに上書きされるかもしれません)。

関連する問題