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

Wpf 为什么在这种情况下无法解析StaticResource?,wpf,xaml,staticresource,Wpf,Xaml,Staticresource,我遇到一个异常“找不到名为“mrg”的资源。资源名称区分大小写。”当我尝试执行以下操作时: MainWindow.xaml: <Window.Resources> <Thickness Left="0" Right="1" Bottom="2" Top="3" x:Key="mrg" /> </Window.Resources> <Grid>

我遇到一个异常“找不到名为“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;
    }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
列表源=新列表()
{
“项目1”,
“项目2”,
“项目3”,
“项目4”,
“项目5”,
};
DataContext=源;
}
}
和UserControl1.xaml:

<Grid>
    <TextBlock Text="{Binding}" Margin="{StaticResource mrg}" />
</Grid>

根据报告:

静态资源查找行为

  • 查找过程在由设置属性的元素定义的资源字典中检查请求的键

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

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

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

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


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

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

    我在MSDN中找不到一个引用,只是,它的内容如下:

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



    使用
    DynamicResource
    而不是
    StaticResource
    将克服这个问题。但是我不知道确切的原因。也许可以在中的静态资源查找行为和动态资源查找行为部分找到解释,但我不确定。

    在代码清理之后,我遇到了类似的问题。代码看起来并编译得很好,但在运行时会产生“StaticResourceNotFound错误”


    将StaticResource更改为DynamicResource确实有效。但是,这实际上取决于App.xaml以及在
    部分下添加资源字典的顺序。

    必须在引用静态资源之前定义它们


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

    好建议,我将继续调查这个问题。在我的例子中,我通过在窗口内的资源字典或需要它的usercontrol中进行合并,而不是在App.xaml的“globally”中进行合并来修复它。所有这些在设计时看起来都很好,但在运行时出现了这个异常,所以有点令人费解。@SoMoS您使用了一些IoC吗?我也遇到了同样的问题,换成动态也解决了。我正在使用MEF从TViewModel按名称约定加载视图。在这种情况下,我没有使用它:\DynamicResource在我尝试它时确实起作用,但考虑到它似乎在运行时绑定了一些东西,我担心使用它。在我的案例中,我发现我在申报顺序中犯了一个新手错误,我在阅读了这里的答案后纠正了这个错误: