为什么在这种情况下无法解析StaticResource?

时间:2013-01-22 08:52:11

标签: wpf xaml 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 article

静态资源查找行为

  1. 查找过程检查由设置属性的元素定义的资源字典中的请求密钥。

  2. 然后,查找过程向上遍历逻辑树,到父元素及其资源字典。这一直持续到达根元素。

  3. 接下来,检查应用程序资源。应用程序资源是资源字典中由WPF应用程序的Application对象定义的资源。

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

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

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

3 个答案:

答案 0 :(得分:16)

DataTemplate构成了自己的逻辑树,它与ItemsControl的逻辑树断开连接。因此,遍历逻辑树的查找将找不到资源。

我无法在MSDN中找到引用,只有this article on CodeProject,其中包含:

  

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


使用DynamicResource代替StaticResource可以解决问题。但是,我无法确切地说出原因。也许可以在Static and Dynamic Resources中的静态资源查找行为动态资源查找行为部分找到解释,但我不确定。

答案 1 :(得分:2)

代码清理后我遇到了类似的问题。代码查看和编译正常但会产生&#34; StaticResource未找到错误&#34;在运行时。

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

答案 2 :(得分:2)

必须在引用之前定义StaticResources。

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