2013-01-22 64 views
15

我有个例外“找不到名为'mrg'的资源,资源名称区分大小写。”当我试图做到以下几点:为什么StaticResource在这种情况下无法解析?

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对象定义的资源。

所以资源不得不因为步骤2的被发现,但,我可以在Locals窗口看到,当异常被逮住时,UserControl1.Parent == null

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

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

回答

16

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

我无法找到在MSDN的引用,只是this article on CodeProject,其中记载:

是膨胀模板的一部分的元件,以下简称 为“模板分子”,形式他们自己的逻辑树即 从它们创建的对象的逻辑树上断开连接 。


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

+0

很好的建议,我会继续调查这个问题。 – stukselbax

+1

用动态替换静态工作,不知道为什么.. –

+0

在我的情况下,我通过合并在需要它的窗口或用户控件内的资源字典来解决它,而不是合并在App.xaml“全局”。所有人都在设计时看起来很好,但在运行时得到了这个异常,所以这有点令人费解。 – angularsen

0

我有一个类似的问题后,代码清理。代码看起来和编译得很好,但会在运行时产生“StaticResource not found error”。

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

1

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

与未知静态链接到资源面前,XAML解析器会抛出异常。(这个问题可以通过使用动态的资源来解决,但它承载的附加费用)

相关问题