[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 ...
随机推荐
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...
- jQuery源码学习感想
还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- 解决新版Android studio导入微信支付和支付宝官方Demo的问题
最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥.私钥和APPID等,所以就用下开放平台的呗. ...
- 【分布式】Zookeeper使用--Java API
一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...
- 精彩 JavaScript 代码片段
1. 根据给定的条件在原有的数组上,得到所需要的新数组. ——<JavaScript 王者归来> var a = [-1,-1,1,2,-2,-2,-3,-3,3,-3]; functio ...
- 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
上次的nodejs操作arduino入门篇中实现了如何连接arduino.这次我们来实现通过arduino测量室内温度并在浏览器上显示出来. [所需材料] 硬件:LM35温度传感器,arduino u ...
- VS2015 Update2中有关cordova和xamarin安装的问题
最近VS2015出了Update2,当然是第一时间进行了安装,中间过程曲折,反复安装卸载n次,也算是获得了一定的安装经验值.现在说一下经常出的问题. Update2里最吸引人的当然是跨平台开发的部分, ...
- jquery禁用文本框
禁用文本框 //文本框禁用 $("input[type='text']").each(function () { $("#" + this.id).attr(& ...
- php实现设计模式之 模板方法模式
<?php /** * 模板模式 * * 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤 * */ abstract class ...