15

「'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 オブジェクトによって定義されるリソース ディクショナリ内のリソースです。

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

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

私の質問は: なぜ StaticResource connot が見つからないのですか?

4

3 に答える 3

17

DataTemplate は、ItemsControl の論理ツリーから切り離された独自の論理ツリーを形成します。したがって、論理ツリーをたどって検索してもリソースは見つかりません。

MSDN で参照を見つけることができませんでした。 CodeProject に関するこの記事だけで、次のように書かれています。

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


DynamicResourceの代わりに使用StaticResourceすると、問題が解決します。しかし、正確な理由はわかりません。Static and Dynamic ResourcesのStatic resource lookup behavior およびDynamic resource lookup behaviorセクションで説明が見つかるかもしれませんが、よくわかりません。

于 2013-01-22T10:15:35.873 に答える
2

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

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

于 2016-08-17T09:12:20.743 に答える