7

我正在使用 C# 和 XAML 开发 Metro 风格的应用程序(适用于 Windows 8)。我已将我的视图模型设置为用作设计时数据上下文,如下所示:

xmlns:vm="using:hub.ViewModels"
d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=vm:ViewModels

我的应用程序在运行时似乎运行良好,但在 VS 2012 和 Blend 的设计视图中,我偶尔会收到以下(无用)错误消息:

An Exception was thrown. TargetException: Error in the application.
Stacktrace
at System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e)
InnerException: None

这只发生在设计视图中——这意味着我不能围绕我的所有 INotifyPropertyChanged() 事件设置断点。

调试设计时错误的最佳方法是什么?

4

3 回答 3

22

如果这种情况始终或半一致地发生,您可以将调试器附加到 XAML 设计器:

  1. 启动 Visual Studio;打开您的项目并打开一个 XAML 文件,导致 XAML 设计器加载

  2. 启动 Visual Studio 的第二个实例。打开您的项目,但确保没有打开任何 XAML 文档。

  3. 确保禁用“仅我的代码”:从“工具”菜单中,选择“选项” 。选择调试类别。在“常规”页面中,确保未选中“仅启用我的代码”旁边的复选框。

  4. Debug菜单中,选择Exceptions...并选中Common Language Runtime Exceptions旁边的Thrown复选框。这将启用对所有 CLR 异常的第一次机会处理。如果您知道异常的特定类型,则可以仅针对该类型启用首次机会处理。

  5. Debug菜单中,选择Attach to Process。在Attach to:字段中,单击Select...并检查列表中的Managed (v4.5, v4.0)条目,然后单击OK

    这是必要的,因为如果调试器在进程执行本机代码时附加,则调试器可能会将进程误检测为本机进程。如果您的项目包含本机代码,您还需要选中列表中的本复选框(您可以同时调试托管代码和本机代码)。

  6. 可用进程列表框中,找到与您的项目对应的xdesproc.exe ,然后单击附加

    如果有多个进程(通常是因为您打开了多个项目或者因为设计器正在重新加载或最近重新加载),则可能很难确定哪个设计器进程属于哪个 Visual Studio 实例。连接到所有这些通常是最简单的。Process Explorer之类的工具可以帮助您确定哪个设计器进程属于哪个 Visual Studio 实例。

    注意:不要将调试器附加到属于您用于调试的同一 Visual Studio 实例的设计器进程 (xdesproc):这样做可能会导致 Visual Studio 挂起。您必须始终使用两个不同的 Visual Studio 实例。

  7. 做任何你需要做的事情来重现这个错误。当它发生时,调试器将在抛出异常的地方中断。调试器应该为您的程序集加载符号。

于 2012-08-03T23:18:51.900 回答
5

我在寻找有关如何调试设计器时间实例问题的信息时来到这里,尽管我没有遇到与 rikkit 相同的问题。但是......我正在分享相关问题的解决方案,以防其他人也遇到同样的问题:

确保将“启用/禁用项目代码”切换设置为“启用”...在 VS/Blend 2015 中,它是 XAML 编辑器下方的一个小图标,如下 所示

如果它被禁用,这可能是您的设计时实例似乎无法正常工作的原因。

此外,如果它被禁用并且您尝试使用第二个 VS 实例进行调试,那么当您附加到 XDesProc 时,您在代码隐藏中设置的任何断点都会报告它们“当前不会被命中。[因为]没有符号被为此文档加载”。您可能认为您需要以某种方式加载符号,但如果您打开“模块”窗口尝试这样做,您甚至不会在列表中看到您的模块。

由于此设置被禁用,我在这个问题上浪费了几个小时。希望这可以帮助其他人不这样做。

于 2016-06-22T20:18:12.763 回答
0

我不确定,但我相信您可以检查IsInDesignModeProperty字段。我记得有时必须在 WinForms 上这样做。

另请查看此链接Troubleshooting WPF Designer Load Failures

于 2012-08-03T23:09:32.703 回答