Как вы отлаживаете исключение XamlParseException?

Я пытаюсь использовать сторонний компонент в моем приложении 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?

Ответы

Ответ 1

Оказывается, моя конкретная проблема заключалась в том, что компонент ComponentOne работает только под Silverlight 4. После того, как я перешел на целевой SL4, все это сработало.

Ответ 2

Может быть, немного искатель, которого можно найти. В основном попытайтесь собрать как можно больше деталей из отладчика.

  • Установите отладчик на разрыв XamlParseException.
  • Посмотрите на столбец. Возможно, что конструктор контрольного контроля находится в стоп-кадре.
  • При паузе перейдите в окно отладки локалей, чтобы узнать, показывают ли какие-либо параметры функции больше о том, какой компонент это есть.
  • Если вы не дважды щелкните следующую запись в стеке и перейдите к шагу 3.
  • Повторите шаги 3 и 4.

После того, как я написал это, я понял, что конструктор управления действительно находится в callstack, и это SpellCheckerSample. Скорее всего это страница .XAML для этого элемента управления. Если вы можете получить доступ к источнику, имя файла, скорее всего, похоже на SpellCheckerSample.xaml.

Ошибка сама по себе довольно прямолинейна, похоже, что в одном и том же ResourceDictionary есть несколько вещей, определенных одним и тем же ключом. Код ниже приведет к тому, что это произойдет:

<Window.Resources>
  <myConverters:BananaToCarrotConverter x:Key="StupidestConverterEver" />
  <myConverters:BananaToAppleConverter x:Key="StupidestConverterEver" />
<Window.Resources>

Ответ 3

Проверьте, какие ссылки ResourceDictionary вы получили - обычно это означает, что один из них получил ошибку, которая должна быть исправлена.

Если ваше исключение является причиной из App, вероятно, это один из ваших объединенных dirs, иначе это элемент управления.

Также проверьте, что вы не пропускаете использование ресурса dir для стилей (помогает, если вы получили ReSharper, так как вы получите предупреждение во время разработки XAML).

enter image description here

Ответ 4

  • Установите отладчик на разрыв XamlParseException (Debug → Exceptions → Common Language Runtime Exceptins → System.Windows.Markup → строка XamlParseException → установите отметку в столбце "Бросок" )
  • Взгляните на исключение в отладчике (особенно на свойства InnerException и LineNumber)
  • Попробуйте пройти через столбец по строкам. Выбрав строку, посмотрите на окно Locals. Он показывает некоторые переменные даже в рамочном коде, который может быть полезен.
  • Попробуйте удалить часть XAML и посмотреть, произойдет ли исключение. Это поможет вам найти код, вызывающий проблемы.

Ответ 5

При попытке запустить приложение вы должны увидеть ошибку в файле .cs. И соответствующий .xaml файл для этого файла .cs с заданным номером строки и столбцом является правильным.