Visual Studio 没有源代码

4

我真的不知道该怎么办了,已经试图解决这个问题几个小时了。我很迷茫。在我上次检查时运行良好的一个操作中,我收到了以下异常。

'{DependencyProperty.UnsetValue}' 不是 'Foreground' 属性的有效值。

它没有把我带到错误发生的地方。它将我带到一个页面,显示“无可用源”,除此之外什么也没有。我尝试在各个地方放置断点来查找错误,但似乎每次运行都在不同的点失败。InnerException 为空。

我看过这个问题,以及谷歌上的各种文章。我搞不清楚到底发生了什么,也不知道如何从这里进行故障排除。Visual Studio 输出似乎没有提供更详细的信息,但如果需要我可以贴出来。任何帮助都将不胜感激。

2个回答

6

我想你可能缺少了一些资源。如果你做了类似以下的操作:

<Window x:Name="window" x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:WpfApplication4"
        Title="MainWindow" Height="350" Width="525" >
    <Window.Resources>
    <Style TargetType="Button">
        <Setter Property="Foreground" Value="{StaticResource NoSuchResourceKey}" />
    </Style>
    </Window.Resources>
    <StackPanel>
        <Button Content="Click Me" />
    </StackPanel>
</Window>

那么您将会得到这样一个异常。我们甚至可以使用 ComponentResourceKey 来产生这个异常:

<Style TargetType="Button">
    <Setter Property="Foreground" Value="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=NoSuchResourceKey}}" />
</Style>

有几个问题会导致这个问题。通常,在使用StaticResource时,你会得到编译器错误,指出资源不存在。比如在这种情况下:

<Button Content="Click Me" Foreground="{StaticResource NoSuchResourceKey}" />

如果我们改为这样做:

如果我们改为这样做:

<Button Content="Click Me" Foreground="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=NoSuchResourceKey}}" />

然后你会得到一个不同的异常(XamlParseException),内容如下:
“在'System.Windows.StaticResourceExtension'上提供值引发了异常。行号为“6”,行位置为“22”。”
内部异常是:
“找不到名为'TargetType=System.Windows.FrameworkElement ID=NoSuchResourceKey'的资源。资源名称区分大小写。”
这一切都导致了真正的问题(缺少资源)。前两个示例不能给我们有用的异常的原因是,我们没有设置Foreground属性。我们正在设置Setter对象的Value属性。因此,当找不到资源时,将使用DependencyProperty.UnsetValue。这对于Setter.Value属性来说是完全有效的。
稍后,当样式应用于按钮时,我们会收到异常,因为这时DependencyProperty.UnsetValue实际上被分配给Button.Foreground属性。
要解决此问题,我建议在整个解决方案中搜索“Property =”Foreground“”,并查找任何使用不存在资源的实例。
我应该补充说明,当使用DynamicResource时,您不会收到异常,因为传递给Button.Foreground属性的值是“特殊值”(允许延迟查找)。除非找到资源,否则这个“特殊值”不会分配给给定的属性。

问题最终是由我使用的资源字典中的错误引用引起的。 - Kyeotic
使用DynamicResource的好处是什么?静态和动态之间是否存在性能差异? - Kyeotic
@Tyrsius - 不,这不是使用DynamicResource的好理由。与StaticResource相比,使用它会增加额外的开销。该“特殊值”将被保留,并且可以在运行时重新查询相关资源。实际上,在这种情况下只需要更好的错误报告即可。 - CodeNaked
@CodeNaked +1 很好的详细解释。如果您尝试将画刷分配给颜色,也会发生一些此类错误报告。 - Koert van Kleef

1

你是否重新构建了你的项目?你的PDB文件可能与你的DLL文件不匹配,因此VS可能无法加载它们。至于错误本身,很可能是绑定到Foreground属性出现了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接