例外が発生しました "'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の記事 によると:
静的リソースルックアップ動作
ルックアッププロセスは、プロパティを設定する要素によって定義されたリソースディクショナリ内で要求されたキーをチェックします。
次に、ルックアッププロセスは、論理ツリーを上方向にトラバースして、親要素とそのリソースディクショナリに到達します。これは、ルート要素に到達するまで続きます。
次に、アプリケーションリソースがチェックされます。アプリケーションリソースは、WPFアプリケーションのApplicationオブジェクトによって定義されるリソースディクショナリ内のリソースです。
したがって、ステップ2のためにリソースを見つける必要がありました。しかし、例外がキャッチされたときにLocals
ウィンドウで確認できるように、UserControl1.Parent == null
。
私はこの問題で混乱しています。私がそれを解決できる方法は、リソースをアプリケーションレベルに置くことです。
私の質問は、StaticResourceが見つからない理由です。
DataTemplateは、ItemsControlの論理ツリーから切断された独自の論理ツリーを形成します。したがって、論理ツリーをトラバースしてルックアップしても、リソースは見つかりません。
私はMSDNでリファレンスを見つけることができませんでした、ただ CodeProjectに関するこの記事 、それは読む:
拡張テンプレートの一部である要素(以下「テンプレート要素」と呼びます)は、作成されたオブジェクトの論理ツリーから切り離された独自の論理ツリーを形成します。
DynamicResource
の代わりにStaticResource
を使用すると、問題が解決します。しかし、その理由は正確にはわかりません。たぶん、説明は 静的および動的)の静的リソース検索動作および動的リソース検索動作セクションにあります。リソース 、しかし私にはわかりません。
コードのクリーンアップ後に同様の問題が発生しました。コードは正常に表示およびコンパイルされましたが、実行時に「StaticResource notfounderror」が生成されました。
StaticResourceをDynamicResourceに変更しても機能しました。しかし、それは実際にはApp.xamlと、<ResourceDictionary.MergedDictionaries>
セクションの下にリソースディクショナリが追加された順序に帰着しました。
StaticResourcesは、参照する前に定義する必要があります。
リソースへの不明な静的リンクに直面すると、XAMLパーサーは例外をスローします(この問題は動的リソースを使用することで解決できますが、追加のコストがかかります)