[No0000AE]在 Visual Studio 中调试 XAML 设计时异常
在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况。很多时候由于最终生成的项目在运行时并不会出现同样的异常,我们往往会忽略设计时异常,仅仅通过关闭设计器在设计时执行代码的功能来规避设计器异常的问题。
规避设计时异常
一般有两种做法:
1.关闭设计器执行代码

在 Visual Studio 2015 中,XAML 设计器左下角的这个按钮可以随时开启或关闭设计器执行代码。如果在 UI 相关的代码中存在问题,而设计器不去执行,就不会造成设计器异常。但代价是无法在设计器中预览数据绑定等效果。
2.对设计时代码进行调试,定位并解决问题
另一种做法是在代码中检测当前代码是否运行在设计时中,如果是,则不继续执行。
对于UWP应用,可以通过Windows.ApplicationModel.DesignMode.DesignModeEnabled属性检测当前是否出于设计时;
对于WPF,可以使用System.ComponentModel.DesignerProperties.GetIsInDesignMode(DependencyObject)方法进行检测。
但很多时候我们需要在设计器中实时查看自定义控件的表现、预览数据绑定的效果,这时就不能仅仅通过关闭设计器执行代码或通过判断是否处于来规避设计时异常了,而必须对设计时代码进行调试,定位并解决问题。
2.1调试设计时代码
要对设计时代码进行调试,原理与平时调试项目是相同的,只需一些额外的步骤。
假设我们有一个 UWP 项目,项目中构建了一个自定义控件,代码如下:
public class MyCustomControl : ContentControl
{
public MyCustomControl()
{
if (DesignMode.DesignModeEnabled)
{
this.Content = "√DESIGN MODE ENABLED!";
throw new Exception("my exception for design mode!");
}
else
{
this.Content = "√DESIGN MODE DISABLED!";
}
throw new Exception("my exception for design mode!");
} private string _myProperty1 = "";
public string MyProperty1
{
get { return _myProperty1; }
set { _myProperty1 = value; }
}
}
可以看到在控件的构造函数中判断当前是否处于设计时,如果是,则抛出一个异常。假设此时我们不清楚自定义控件中造成设计器异常的原因,我们需要在自定义控件的构造中设断点进行中断调试。
调试步骤如下:
1. 关闭当前 Visual Studio 打开的所有文档。
2. 打开进程管理器,结束所有名为 XDesProc.exe 的进程。该进程即 XAML 设计器的进程。
3. 在要调试的项目中,打开任意 XAML 页面。
4. 启动一个新的 Visual Studio 实例,并通用打开要调试的项目,在代码中的目标位置设好断点。
5. 在新启动的 Visual Studio 中,点击 调试(Debug) 菜单,选择 附加到进程 (Attach to Process)。
6. 在 附加到进程 (Attach to Process) 窗口中,将 附加到 (Attach to): 更改为Managed (v4.6, v4.5, v4.0) code,注意不是 Managed (CoreCLR)。
7. 在 可用进程 (Available Processes) 中选择 XDesProc.exe,然后点击 附加 (Attach)按钮开始调试。注意如果前述步骤操作正确,这一步骤中进程列表里只会有一个 XDesProc.exe,也就是第一个 Visual Studio 的设计器进程。
8. 在第一个 Visual Studio 中,确保开启了设计器执行代码按钮,打开包含自定义控件的 XAML 页面,此时设计器会对自定义控件实例化,执行自定义控件的构造函数,继而触发在第二个 Visual Studio 的调试中设置的断点。
对于 WPF 项目,要调试设计时异常,所用步骤与上述步骤相同。一般造成设计时异常的常见原因是自定义控件、XAML 页面代码或数据绑定所引用的资源在设计时没有实例化;自定义控件的计算和布局方法存在错误等。无论如何,在设计时可见 XAML 元素并对 UI 行为进行预览对于完善开发体验,确保应用正常工作有着重要意义,推荐不要因为最终生成的应用可以正常运行就忽略设计时异常,而是通过调试进行定位修复。
[No0000AE]在 Visual Studio 中调试 XAML 设计时异常的更多相关文章
- 在 Visual Studio 中调试 XAML 设计时异常
在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...
- Xamarin XAML语言教程Visual Studio中实现XAML预览
Xamarin XAML语言教程Visual Studio中实现XAML预览 每次通过编译运行的方式查看XAML文件效果,需要花费大量的时间.如果开发者使用XAML对UI进行布局和设计,可以通过预览的 ...
- 在Chrome+Visual Studio中调试asp.net程序很慢的问题(Firefox也有类似问题)
在Chrome+Visual Studio中调试asp.net程序很慢的问题(Firefox也有类似问题) 今天开始起在Chrome中调试,发现问题主要出在菜单栏(layout文件)中,google了 ...
- [译]如何在visual studio中调试Javascript
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 在 Visual Studio 中调试时映射调用堆栈上的方法
本文转自:https://msdn.microsoft.com/zh-cn/library/dn194476.aspx 1.创建代码图,以便在调试时对调用堆栈进行可视化跟踪. 你可以在图中进行标注以跟 ...
- 在Visual Studio中调试时,如何检查有关进程令牌的详细信息?
从Visual Studio 2005开始,watch窗口获得了一个伪寄存器,用于调查有关进程令牌的详细信息.所以,你只要开始调试,在监视窗口中写下“$user”, 有时查看特权和组的扩展视图会很有趣 ...
- 通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序
最近两天在Linux中调试.NET Core应用程序,同时我发现在Linux中调试.NET Core应用程序并不容易.一直习惯在Visual Studio中进行编码和调试.现在我想的是可以简单快速的测 ...
- 教程:Visual Studio 中的 Django Web 框架入门
教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...
- Visual Studio中用于ASP.NET Web项目的Web服务器
当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...
随机推荐
- Vertica集群单节点宕机恢复方法
Vertica集群单节点宕机恢复方法 第一种方法: 直接通过admintools -> 5 Restart Vertica on Host 第二种方法: 若第一种方法无法恢复,则清空宕机节点的c ...
- 没有神话,聊聊decimal的“障眼法”
0x00 前言 在上一篇文章<妥协与取舍,解构C#中的小数运算>的留言区域有很多朋友都不约而同的说道了C#中的decimal类型.事实上之前的那篇文章的立意主要在于聊聊使用二进制的计算机是 ...
- Linux发邮件之mail命令
一.mail命令 1.配置 vim /etc/mail.rc 文件尾增加以下内容 set from=1968089885@qq.com smtp="smtp.qq.com" set ...
- [JavaEE笔记]Cookie
引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份. 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话.常用会话跟踪技术是 Cookie 与 Session. ...
- 如果你也会C#,那不妨了解下F#(4):了解函数及常用函数
函数式编程其实就是按照数学上的函数运算思想来实现计算机上的运算.虽然我们不需要深入了解数学函数的知识,但应该清楚函数式编程的基础是来自于数学. 例如数学函数\(f(x) = x^2+x\),并没有指定 ...
- C#中级-常用多线程操作(持续更新)
一.前言 多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参 ...
- MVC5发送邮件注册
#region 发送邮件 //填写电子邮件地址,和显示名称 System.Net.Mail.MailAddress from = new System.Net.Mail.MailAddress(&qu ...
- 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件
[源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...
- Swing布局管理器介绍
创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...
- session & cookie(li)
Session & Cookie 一.定义 Session,用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.Cookie,由服务器端生成,发送 ...