为什么静态资源不能在这种情况下得到解决?(Why the StaticResource cannot

2019-07-18 12:44发布

我有一个异常“无法找到名为‘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. 接下来,应用资源进行检查。 应用资源是资源字典中的资源由Application对象为您的WPF应用程序定义。

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

我在这个问题感到困惑。 我可以解决这个问题的方法是把资源的应用水平。

我的问题是:为什么静态资源被粗野,找到?

Answer 1:

在DataTemplate中形成了自己,这是从ItemsControl的逻辑树断开的逻辑树。 因此,通过遍历逻辑树的查找将无法找到资源。

我没能找到在MSDN的参考,只是这篇文章在CodeProject上 ,其中记载:

是扩展的模板的一部分的元件,下文中被称为“模板分子”,形成从用于创建它们的对象的逻辑树断开自己的逻辑树。


使用DynamicResource替代StaticResource将解决这个问题。 但是我不能确切原因告知。 也许解释可以在静态资源查找行为动态资源查找行为章节中找到静态和动态资源 ,但我不知道。



Answer 2:

我一个代码清理后也有类似的问题。 代码看起来和编译罚款,但会产生一种“静态资源未找到错误”在运行时。

更改静态资源到DynamicResource没有工作。 但是,它真的来到了的App.xaml并在资源字典中根据添加的顺序<ResourceDictionary.MergedDictionaries>部分。



Answer 3:

StaticResources必须提到他们之前定义。

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



文章来源: Why the StaticResource cannot be resolved in this case?