如何调试XamlParseException?

14

我试图在我的Silverlight应用程序中使用第三方组件,但当我尝试创建该控件的实例时,我遇到了XamlParseException错误:

{System.Windows.Markup.XamlParseException: **Set property 'System.Windows.FrameworkElement.Style' threw an exception.** [Line: 0 Position: 0] 
---> System.Windows.Markup.XamlParseException: **Elements in the same ResourceDictionary cannot have the same x:Key** [Line: 1739 Position: 47]    
at MS.Internal.XcpImports.CreateFromXaml(UnmanagedMemoryStream stream, String sourceAssemblyName, boolean createNamescope, Boolean requireDefaultNamespace, Boolean allowEventHandlers)    
at System.Windows.Controls.Control.GetBuiltInStyle(IntPtr nativeTarget, IntPtr& nativeStyle)    
--- End of inner exception stack trace ---    
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)    
at SpellCheckerSample.StandardSpellDialog.InitializeComponent()    
at SpellCheckerSample.StandardSpellDialog..ctor()}

我该如何调试这个问题?如何知道文件的第1739行,第47个位置在哪里?

5个回答

7
可能有点难找。基本上,尝试从调试器中收集尽可能多的细节。
  1. 将调试器设置为在 XamlParseException 上中断。
  2. 查看调用堆栈。可能会发现有问题的控件构造函数在调用堆栈上。
  3. 暂停时,转到局部变量调试窗口,以查看函数的任何参数是否揭示了更多关于此组件的信息。
  4. 如果没有,请双击下面的下一个堆栈条目并转到步骤3。
  5. 重复步骤3和4。
在我写完这篇文章后,我意识到控件的构造函数确实在调用堆栈上,它是 SpellCheckerSample。很可能是该控件的 .XAML 页面。如果您可以访问源代码,则文件名很可能类似于 SpellCheckerSample.xaml
错误本身非常直截了当,看起来在同一 ResourceDictionary 中定义了多个具有相同键的内容。以下代码将导致出现此问题:
<Window.Resources>
  <myConverters:BananaToCarrotConverter x:Key="StupidestConverterEver" />
  <myConverters:BananaToAppleConverter x:Key="StupidestConverterEver" />
<Window.Resources>

1
是的,我同意。如果您能看到导致问题的键是哪个就好了。我很感激您的帮助,但它还没有给我带来任何有用的结果 :( - Craig Shearer
你有这个库的源代码吗?如果你有正确的文件,Line: 1739 Position: 47 将会带你到引起问题的资源。 - Igor Zevaka
实际上,这是ComponentOne Silverlight SpellChecker组件。我已经将我的应用程序砍成碎片 - 删除了App.xaml文件中的所有资源,但仍然失败。然而,我有一个来自ComponentOne的示例应用程序可以正常工作。非常奇怪。不过,我会继续努力寻找解决方法! - Craig Shearer

2
原来我的问题在于ComponentOne组件只能在Silverlight 4下工作。一旦我改为针对SL4,所有的问题都得到了解决。

1
是的,这样做纯属浪费时间!感谢您的建议。 - Craig Shearer

0
  1. 将调试器设置为在XamlParseException时中断 (调试 -> 异常 -> 公共语言运行时异常 -> System.Windows.Markup -> XamlParseException 行 -> 在Thrown列中打勾)
  2. 在调试器中查看异常(特别是InnerException和LineNumber属性)
  3. 尝试逐行查看调用堆栈。在选择一行时查看Locals窗口。它会显示一些变量,甚至是框架代码中的变量,这可能会有所帮助。
  4. 尝试删除XAML的某些部分,并查看是否再次出现异常。这将帮助您定位引起问题的代码。

0

检查一下你使用了哪些ResourceDictionary引用 - 问题通常是其中一个出现了需要修复的错误。

如果你的异常是由App引起的,那么很可能是你合并的目录之一,否则就是相关的控件。

还要检查一下你是否缺少样式资源目录的使用(如果你使用了ReSharper,因为在XAML设计时会收到警告,这会有所帮助)。

enter image description here


-1

在尝试运行应用程序时,您应该在.cs文件中看到一个错误。 并且对于此.cs文件,给定的行号和列所对应的.xaml文件是正确的。


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