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 对象定义的资源字典中的那些资源。

因此,由于第 2 步,必须找到资源。但是,正如我在Locals捕获异常时在窗口中看到的那样,UserControl1.Parent == null.

我对这个问题感到困惑。我可以解决的方法是将资源放到应用程序级别。

我的问题是:为什么找不到 StaticResource ?

4

3 回答 3

17

DataTemplate 形成自己的逻辑树,它与 ItemsControl 的逻辑树断开连接。因此,通过遍历逻辑树进行查找不会找到资源。

我无法在 MSDN 中找到参考,只有CodeProject 上的这篇文章,其中内容如下:

作为扩展模板一部分的元素,以下称为“模板元素”,形成它们自己的逻辑树,该逻辑树与为其创建它们的对象的逻辑树断开连接。


使用DynamicResource代替StaticResource将克服这个问题。但是我不能确切地说出为什么。也许可以在静态和动态资源的静态资源查找行为动态资源查找行为部分找到解释,但我不确定。

于 2013-01-22T10:15:35.873 回答
2

代码清理后我遇到了类似的问题。代码看起来和编译都很好,但会在运行时产生“StaticResource not found 错误”。

将 StaticResource 更改为 DynamicResource 确实有效。但是,它实际上归结为 App.xaml 以及在该<ResourceDictionary.MergedDictionaries>部分下添加资源字典的顺序。

于 2016-02-01T15:29:17.573 回答
2

StaticResources 必须在引用它们之前定义。

面对未知的资源静态链接,XAML解析器抛出异常。(这个问题可以通过使用动态资源来解决,但是需要额外的成本)

于 2016-08-17T09:12:20.743 回答