调试 Expression Blend 应用程序

如果 Microsoft Expression Blend 应用程序的行为与预期不符,或者在尝试测试应用程序时出错,则说明应用程序中包含错误。理解错误的原因或者找出错误在应用程序中的位置可能很困难,但理解可能遇到的错误类型会有所帮助。

语法错误

在生成应用程序时,任何语法错误都将显示在 Expression Blend 的“结果”面板的“错误”选项卡中或 Microsoft Visual Studio 2008 的“错误列表”面板中。

如果可扩展应用程序标记语言 (XAML) 或代码不符合语言的格式设置规则,就会出现语法错误。错误的说明有助于理解如何更正该错误。该说明还指定了出现错误的文件名称和行号。语法错误的某些常见原因如下:

  • 关键字的拼写错误或大小写错误。

  • 文本字符串前后丢失问号。

  • XAML 元素丢失结束标记。

  • XAML 元素出现在不允许使用的位置。通过在 Expression Blend 的“设计”视图中或在 Visual Studio 2008 中编辑文档,可以避免发生这些错误。

  • 在代码文件中,函数调用或方法调用未包含必要的参数。例如,MessageBox.Show() 方法必须至少具有一个参数(如字符串 MessageBox.Show("Hello"))。

  • 在代码文件中,某种类型的变量被指定了不同的类型。例如,MessageBox.Show() 方法可以具有字符串参数,但不能具有整数参数。

  • 在 C# 中,不需要参数的方法可能未在末尾包含小括号。例如,this.InitializeComponent; 将导致语法错误,因为正确的代码行是 this.InitializeComponent();。

有关 XAML 语法的信息,请参阅 MSDN 上的 Windows Presentation Foundation 部分中的控件库(此链接可能指向英文页面)主题中列出的各个控件的概述主题。有关编程语法的信息,可在 MSDN 上搜索代码中的关键字。

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

编译错误

在生成应用程序时,任何编译错误都将显示在 Expression Blend 的“结果”面板的“错误”选项卡中或 Visual Studio 2008 的“错误列表”面板中。

当 Expression Blend 或 Visual Studio 2008 的编译系统无法找到项目所需的内容时,将发生编译错误。例如,如果 WPF 项目丢失对 WPF 程序集的引用,则可能会出现类似“名称‘Window’在命名空间‘https://schemas.microsoft.com/winfx/2006/xaml/presentation’中不存在”的错误。如果出现此错误,则可以单击“项目”菜单上的“添加引用”,添加对 C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5 文件夹中的下列 WPF 程序集的引用:

  • PresentationCore.dll

  • PresentationFramework.dll

  • WindowsBase.dll

如果仍然出现类似“名称‘<member>’在当前上下文中不存在”的错误,则可能丢失了其他程序集引用,或者可能需要在代码中为丢失的命名空间添加 using (C#) 或 Imports (Visual Basic .NET) 语句。若要找出需要哪个程序集或命名空间,请参阅 MSDN 上与导致错误的成员相关的参考主题。

编译错误的某些常见原因如下:

  • 关键字的拼写错误或大小写错误。

  • 应用程序中对类的引用不正确。例如,如果应用程序使用在单独的 .cs 或 .vb 代码文件(对于 Microsoft Silverlight 1.0 项目则为 .js 代码文件)中实现的且具有自己的命名空间的自定义类,则应用程序中使用该自定义类的任何文档都需要包括如下代码行,其中 FullyQualifiedNamespace 是代码文件中的命名空间:

    xmlns:SampleNamespace="clr-namespace:FullyQualifiedNamespace"
    
  • 编译器选项的设置不正确,或者系统不能生成基于 Microsoft .NET Framework 的应用程序。如果已安装 Microsoft .NET Framework 3.5,并且使用 Expression Blend 或 Visual Studio 2008 生成应用程序,这应不会成为问题。

  • 在尝试生成项目之前有文件尚未保存。例如,如果使用 Expression Blend 的“事件”面板 Cc294906.6c67bb3b-e8a2-4a63-bad5-54d5c15b04dd(zh-cn,Expression.10).png 在代码隐藏文件中生成新的事件处理程序方法(因而在 Visual Studio 中打开该代码隐藏文件),然后尝试在 Expression Blend 中生成项目而不先保存该代码隐藏文件,便会出现错误,指明项目中未包含该事件处理程序的定义。

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

运行时错误

如果生成了应用程序,但它在运行时(在 Expression Blend 中按 F5)的行为与预期不符,则会发生运行时错误。运行时错误是最难识别的一种错误,因为它们涉及逻辑错误。有时候,可以在 XAML 或代码中尝试不同的更改,直到理解其原理,以便更正运行时错误。不过,更快的方法是在应用程序运行时逐行单步执行代码,以便实际观察具体原因。有关详细信息,请参阅本主题中后面的在 Visual Studio 2008 中调试。

运行时错误的某些常见原因如下:

  • XAML 元素的布置不正确,或者使用错误的面板元素来包含其他元素。若要了解布局,请参阅本用户指南中的“布局系统”,或参阅 MSDN 上的 WPF 部分中的布局系统对齐方式、边距和填充边距概述(这些链接可能指向英文页面)。

  • XAML 元素未挂钩到正确的事件处理程序。如果创建了许多事件处理程序方法,然后将一个错误的方法分配给 XAML 元素,就会出现此错误。若要查看为 Expression Blend 中打开的 WPF 项目中的某个 XAML 元素分配了哪些事件处理程序,请在“交互”面板中的“对象和时间线”下选择该元素,然后在“属性”面板中单击“事件”按钮。有关详细信息,请参阅本用户指南中的事件处理和用户交互。在 Silverlight 1.0 中,如果您使用下面的代码将事件处理程序与根元素挂钩:

    rootElement.addEventListener(…);
    

    而不是使用类似下面的代码将事件处理程序与文档中的子元素挂钩,则会发生这种情况:

    this.control.content.findName("WebLink").addEventListener(…);
    

    有关详细信息,请参阅在 Silverlight 应用程序中创建控制 Storyboard 的按钮

  • Expression Blend 中的动画触发器设置不正确。例如,如果希望能够在加载应用程序之后停止或暂停动画 Storyboard,则必须在任意触发器中开始动画 Storyboard。(默认情况下,所有动画 Storyboard 都在“Window.Loaded”触发器中开始,但用户可以进行更改。)有关详细信息,请参阅本用户指南中的动画。有关动画触发器的示例,请参阅创建简单动画或参阅简单样式中的“动手试验!”部分下的主题。

  • 在代码文件中,变量引用了并不存在的对象。例如,在 WPF 项目的代码隐藏文件中,您不能在 this.InitializeComponent() 代码行之前引用 XAML 对象,否则将出现 XamlParseException 错误。

  • 在代码文件中,所做的假设使应用程序进入了意外的代码路径。在 Visual Studio 2008 中调试应用程序时单步执行代码的方法对这种情况的帮助最大。有关详细信息,请参阅本用户指南中的在 Visual Studio 2008 中调试 Expression Blend 应用程序

  • 在代码隐藏文件中,用户界面 (UI) 更新与应该在单独的线程上执行的其他编程逻辑在同一个线程上执行。例如,如果创建一个事件处理程序方法使之先更新“Label”中显示的文本,再执行其他一些计算,然后在事件处理程序方法完成之前再次更新同一“Label”中的文本,则您将只会看到最后一次更新。这是因为 UI 的呈现是在事件处理程序方法结束时执行的,而所有处理都是在同一个线程上完成的,所以应用程序在执行方法以更新 UI 期间不能将工作暂停。有关如何编写具有多个用户界面更新和计算的 WPF 应用程序的信息,请参阅 MSDN上的 WPF 部分中的线程模型(此链接可能指向英文页面)。

  • 在代码隐藏文件内的事件处理程序方法中,UI 元素或其属性在可用之前即被引用。例如,在 WPF 项目的 Window1() 构造函数方法中,还不能访问 UI 元素。在 OnInitialized() 事件处理程序方法中,可以访问 UI 元素,但不能检查类似“ActualWidth”的属性,因为尚未布置 UI 元素。在 OnLoaded() 事件处理程序方法中,可以执行能够对 XAML 文档中存在的 UI 元素执行的任何操作。有关详细信息,请参阅 MSDN上的 WPF 部分中的对象生存期事件(此链接可能指向英文页面)。有关事件及其出现时间的列表,请参阅本用户指南中的 WPF 事件快速参考

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

-

在 Visual Studio 2008 中调试

Expression Blend 是一个设计工具,用于为基于 WPF 的应用程序和 Silverlight 1.0 应用程序创建丰富的用户界面。可以使用 Visual Studio 2008 来打开、生成和调试 Expression Blend 项目。如果在使用 Expression Blend 的“测试”(F5) 功能调试应用程序时遇到问题,可以使用 Visual Studio 2008 获取有关运行时错误的详细错误信息。有关详细信息,请参阅本用户指南中的在 Visual Studio 2008 中调试 Expression Blend 应用程序

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

调试性能问题

WPF 提供了一套性能评估工具,用于分析应用程序的运行时行为并决定如何提高性能。有关详细信息,请参阅 MSDN 上的 WPF 部分中的 WPF 的性能配置工具优化 WPF 应用程序性能(这些链接可能指向英文页面)。

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

事件跟踪

老练的 .NET 程序员可以在 WPF 应用程序中添加代码来触发自定义的调试事件,帮助他们调试更复杂的错误。此功能称为 Windows 事件跟踪 (ETW)。WPF 事件跟踪配置工具使用 ETW 来执行事件记录。有关详细信息,请参阅 MSDN 上的 WPF 的性能配置工具中的“事件跟踪”和“PresentationTraceSources”(此链接可能指向英文页面)。

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

调试混合型应用程序

如果应用程序同时使用了 WPF 和其他技术(如 Windows 窗体编程),可能会遇到诸如意外的重叠行为、缩放行为、控件聚焦问题等问题。有关可帮助您调试混合应用程序的信息,请参阅 MSDN 上的 WPF 部分中的混合应用程序疑难解答(此链接可能指向英文页面)。

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

安全性

应用程序调试时所具有的安全性权限与其他用户使用它时所具有的安全性权限相同。有关详细信息,请参阅本用户指南中的部署和发布 Expression Blend 应用程序。有关 WPF 应用程序安全性的详细信息,请参阅 MSDN 上的 WPF 部分中的安全性(此链接可能指向英文页面)。

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

获取帮助

若要获取有关调试 Expression Blend 应用程序的更多帮助,可以在 Windows Presentation Foundation 论坛(此链接可能指向英文页面)中搜索与您的问题相关的帖子或发布问题。

Cc294906.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首