我有一个异常“找不到名为'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

静态资源查找行为


查找过程在设置属性的元素定义的资源字典中检查请求的键。
然后,查找过程将逻辑树向上遍历到父元素及其资源字典。这一直持续到到达根元素为止。
接下来,检查应用程序资源。应用程序资源是资源字典中由WPF应用程序的Application对象定义的那些资源。


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

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

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

最佳答案

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

我无法在MSDN中找到一个引用,只是this article on CodeProject,其内容为:


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




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

关于wpf - 为什么在这种情况下无法解析StaticResource?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36502056/

10-13 03:35