[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 ...
随机推荐
- 用原始方法解析复杂字符串,json一定要用JsonMapper么?
经常采集数据,肯定会碰到解析字符串,包括整个页面的html,或者json以及一些不标准的json格式... 以前用json序列化,有时候需要实体类,有的时候没有,比较麻烦,听说可以用JsonMappe ...
- 深入理解Sqlserver文件存储之页和应用 (转)
我们每天都在使用数据库,我们部门使用最多的关系数据库有Sqlserver,Oracle,有没有想过这些数据库是怎么存放到操作系统的文件中的?有时候为了能够设计出最优的表结构,写出高性能的Sqlserv ...
- C#/ASP.NET完善的DBHelper,配套Model生成器
支持Oracle.MSSQL.MySQL.SQLite四种数据库,支持事务,支持对象关系映射:已在多个项目中实际使用. 没有语法糖,学习成本几乎为0,拿来即用. DBHelper类完整代码: usin ...
- 安装MySql for Visual Studio的坑
阅读目录 问题描述 解决过程 解决方案 总结 回到顶部 问题描述 安装MySql for Visual Studio 一般来说是为了能在VS的服务器数据连接的数据源中能选择MySql类型,如下图: 但 ...
- C#开发微信门户及应用(24)-微信小店货架信息管理
在前面微信小店系列篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及<C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试& ...
- 简述9种社交概念 SNS究竟用来干嘛?
1.QQ 必备型交流工具基本上每一个网民最少有一个QQ,QQ已经成为网民的标配,网络生活中已经离不开QQ了.虽然大家嘴上一直在骂 QQ这个不好,那个不对,但是很少有人能彻底离开QQ.QQ属于IM软件, ...
- volatile
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的 ...
- Struts 2 数据校验要用到的类和两种校验方式以及一些校验问题的解决
通过继承ActionSupport类来完成Action开发,ActionSupport类不仅对Action接口进行简单实现, 同时增加了验证.本地化等支持 .真实开发中自定义Action都需要继承该类 ...
- 《Web开发过滤Javascript、HTML的方法》
JavaScript过滤方法: 第一种方案:使用 htmlspecialchars 函数转换特殊字符和使用 nl2br 函数插入一些必要的 <br /> 标签. $comment = &l ...
- JS高程4.变量,作用域和内存问题(2)执行环境及作用域
1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为, 每个执行环境都有一个与之相关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 2.全局执行环境: 最外围的 ...