代码之家  ›  专栏  ›  技术社区  ›  Craig Shearer

如何调试XamlParseException?

  •  14
  • Craig Shearer  · 技术社区  · 16 年前

    我正在尝试在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 回复  |  直到 11 年前
        1
  •  7
  •   Igor Zevaka    16 年前

    可能有点麻烦。基本上,尝试从调试器收集尽可能多的细节。

    1. 将调试器设置为中断 XamlParseException .
    2. 看看调用堆栈。可能有问题的控件的构造函数在调用堆栈上。
    3. 暂停后,转到“本地调试”窗口,查看函数的任何参数是否显示有关此组件的更多信息。
    4. 如果没有,双击下一个堆栈条目并转到步骤3。
    5. 重复步骤3和4。

    在我写了这个之后,我意识到控件的构造函数确实在调用堆栈上,它是 SpellCheckerSample . 很可能是该控件的.xaml页。如果您可以访问源,文件名很可能是 拼写检查示例.xaml .

    错误本身是非常直接的,看起来在同一个ResourceDictionary中用同一个键定义了多个东西。以下代码将导致这种情况发生:

    <Window.Resources>
      <myConverters:BananaToCarrotConverter x:Key="StupidestConverterEver" />
      <myConverters:BananaToAppleConverter x:Key="StupidestConverterEver" />
    <Window.Resources>
    
        2
  •  2
  •   Craig Shearer    16 年前

    结果发现我的特定问题是,componentone组件只能在Silverlight4下工作。一旦我换成目标SL4,一切都正常了。

        3
  •  0
  •   Thomas Hagström    12 年前

    检查您获得了什么资源字典引用-问题通常是其中一个获得了需要修复的错误。

    如果您的异常是由应用程序引起的,那么它可能是其中一个合并的目录,否则就是有问题的控件。

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

    其中一个有一个错误需要修复。

    如果您的异常是由应用程序引起的,那么它可能是您合并的目录之一,否则就是有问题的控件。

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

    enter image description here

        4
  •  0
  •   Ilya Serbis    11 年前
    1. 将调试器设置为在XamlParseException上中断 (调试->异常->公共语言运行时异常->system.windows.markup->xamlParseException行->在引发的列中设置勾号)
    2. 看看调试器中的异常(尤其是在 InnerException LineNumber 性质)
    3. 尝试一行一行地遍历调用堆栈。选择线时,请查看“局部变量”窗口。它甚至在框架代码中显示一些可能有用的变量。
    4. 尝试删除XAML的某些部分,并查看异常是否再次发生。这将帮助您找到导致问题的代码。
        5
  •  -1
  •   Piotr Kobylinski    15 年前

    在尝试运行应用程序时,应该在.cs文件中看到错误。 对于具有给定行号和列的.cs文件,相应的.xaml文件是正确的。