web-dev-qa-db-ja.com

この場合、StaticResourceを解決できないのはなぜですか?

例外が発生しました "'mrg'という名前のリソースが見つかりません。リソース名では大文字と小文字が区別されます。"次の操作を実行しようとすると:

MainWindow.xaml:

<Window.Resources>
  <Thickness Left="0"
             Right="1"
             Bottom="2"
             Top="3"
             x:Key="mrg" />
</Window.Resources>
<Grid>
  <ItemsControl ItemsSource="{Binding}">
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <local:UserControl1 />
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</Grid>

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        List<string> source = new List<string>()
        {
            "item1",
            "item2",
            "item3",
            "item4",
            "item5",
        };
        DataContext = source;
    }
}

およびUserControl1.xaml:

<Grid>
    <TextBlock Text="{Binding}" Margin="{StaticResource mrg}" />
</Grid>

msdnの記事 によると:

静的リソースルックアップ動作

  1. ルックアッププロセスは、プロパティを設定する要素によって定義されたリソースディクショナリ内で要求されたキーをチェックします。

  2. 次に、ルックアッププロセスは、論理ツリーを上方向にトラバースして、親要素とそのリソースディクショナリに到達します。これは、ルート要素に到達するまで続きます。

  3. 次に、アプリケーションリソースがチェックされます。アプリケーションリソースは、WPFアプリケーションのApplicationオブジェクトによって定義されるリソースディクショナリ内のリソースです。

したがって、ステップ2のためにリソースを見つける必要がありました。しかし、例外がキャッチされたときにLocalsウィンドウで確認できるように、UserControl1.Parent == null

私はこの問題で混乱しています。私がそれを解決できる方法は、リソースをアプリケーションレベルに置くことです。

私の質問は、StaticResourceが見つからない理由です。

15
stukselbax

DataTemplateは、ItemsControlの論理ツリーから切断された独自の論理ツリーを形成します。したがって、論理ツリーをトラバースしてルックアップしても、リソースは見つかりません。

私はMSDNでリファレンスを見つけることができませんでした、ただ CodeProjectに関するこの記事 、それは読む:

拡張テンプレートの一部である要素(以下「テンプレート要素」と呼びます)は、作成されたオブジェクトの論理ツリーから切り離された独自の論理ツリーを形成します。


DynamicResourceの代わりにStaticResourceを使用すると、問題が解決します。しかし、その理由は正確にはわかりません。たぶん、説明は 静的および動的)の静的リソース検索動作および動的リソース検索動作セクションにあります。リソース 、しかし私にはわかりません。

16
Clemens

コードのクリーンアップ後に同様の問題が発生しました。コードは正常に表示およびコンパイルされましたが、実行時に「StaticResource notfounderror」が生成されました。

StaticResourceをDynamicResourceに変更しても機能しました。しかし、それは実際にはApp.xamlと、<ResourceDictionary.MergedDictionaries>セクションの下にリソースディクショナリが追加された順序に帰着しました。

2
Andrew Korell

StaticResourcesは、参照する前に定義する必要があります。

リソースへの不明な静的リンクに直面すると、XAMLパーサーは例外をスローします(この問題は動的リソースを使用することで解決できますが、追加のコストがかかります)

2