XAML-调试


如果您熟悉任何过程语言(例如 C#、C/C++ 等)中的调试,并且知道Break的用法,并且期望在 XAML 中进行相同类型的调试,那么您会惊讶地发现它不是还可以像调试任何其他过程语言代码一样调试 XAML 代码。调试 XAML 应用程序意味着尝试查找错误;

  • 在数据绑定中,您的数据没有显示在屏幕上,您不知道为什么

  • 或者问题与复杂的布局有关。

  • 或者一些广泛的模板(如列表框和组合框)的对齐问题或边距颜色、叠加等问题。

在 XAML 中进行调试通常是为了检查绑定是否工作,如果不工作,则检查问题所在。不幸的是,除了在 Silverlight 中之外,无法在 XAML 绑定中设置断点,但我们可以使用“输出”窗口来检查数据绑定错误。让我们看一下下面的XAML代码来查找数据绑定中的错误。

<Window x:Class = "DataBindingOneWay.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   Title = "MainWindow" Height = "350" Width = "604">
	
   <Grid>
      <StackPanel Name = "Display">
         <StackPanel Orientation = "Horizontal" Margin = "50, 50, 0, 0">
            <TextBlock Text = "Name: " Margin = "10" Width = "100"/>
            <TextBlock Margin = "10" Width = "100" Text = "{Binding FirstName}"/>
         </StackPanel>
			
         <StackPanel Orientation = "Horizontal" Margin = "50,0,50,0">
            <TextBlock Text = "Title: " Margin = "10" Width = "100"/>
            <TextBlock Margin = "10" Width="100" Text = "{Binding Title}" />
         </StackPanel>
      </StackPanel>
   </Grid>
	
</Window>

两个文本块的文本属性静态设置为“Name”和“Title”,而另外两个文本块的Text 属性则绑定为“FirstName”和“Title”。但是类变量故意被当作 Employee 类中的 Name 和 Title,这是不正确的变量名称。现在让我们尝试了解当未显示所需的输出时我们可以在哪里找到此类错误。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks;

namespace DataBindingOneWay {
   public class Employee {
      public string Name { get; set; } 
      public string Title { get; set; }
		
      public static Employee GetEmployee() {
         var emp = new Employee() {
            Name = "Ali Ahmed", 
            Title = "Developer"
         };
         return emp; 
      }
   }
}

以下是 MainWindow 类在 C# 代码中的实现 -

using System; 
using System.Windows; 
using System.Windows.Controls;

namespace DataBindingOneWay {
   /// <summary> 
      /// Interaction logic for MainWindow.xaml 
   /// </summary> 
	
   public partial class MainWindow : Window {
      public MainWindow() {
         InitializeComponent(); 
         DataContext = Employee.GetEmployee(); 
      }
   }
}

让我们运行这个应用程序,您可以立即在主窗口中看到我们已成功绑定到该 Employee 对象的标题,但名称尚未绑定。

员工详情

要检查该名称发生了什么,让我们查看生成大量日志的输出窗口。

查找错误的最简单方法就是搜索错误,您将发现下面提到的错误,其中显示“BindingExpression 路径错误:在‘对象’‘员工’上找不到‘名字’属性

System.Windows.Data Error: 40 : BindingExpression path error: 'FirstName'
   property not found on 'object' ''Employee' (HashCode = 11611730)'.
BindingExpression:Path = FirstName; 
DataItem = 'Employee' (HashCode = 11611730); target element is 'TextBlock' (Name = ''); 
target property is 'Text' (type 'String')

这清楚地表明 FirstName 不是 Employee 类的成员,因此它有助于解决应用程序中的此类问题。

当您再次将FirstName更改为Name时,您将看到所需的输出。

XAML 的 UI 调试工具

Visual Studio 2015 引入了 XAML 的 UI 调试工具,用于在运行时检查 XAML 代码。在这些工具的帮助下,XAML 代码以正在运行的 WPF 应用程序的可视树形式以及树中不同的 UI 元素属性的形式呈现。要启用此工具,请按照以下步骤操作。

  • 步骤 1 - 转到“工具”菜单并从“工具”菜单中选择“选项”。

  • 步骤 2 - 您将看到以下对话框。

调试对话框
  • 步骤 3 - 转到左侧“调试”项下的“常规选项”。

  • 步骤 4 - 检查突出显示的选项,即“启用 XAML 的 UI 调试工具”

  • 步骤 5 - 按确定按钮。

现在运行任何 XAML 应用程序或使用以下 XAML 代码 -

<Window x:Class = "XAMLTestBinding.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   Title = "MainWindow" Height = "350" Width = "604">
	
   <StackPanel>
      <ComboBox Name = "comboBox" Margin = "50" Width = "100">
         <ComboBoxItem Content = "Green"/>
         <ComboBoxItem Content = "Yellow" IsSelected = "True"/>
         <ComboBoxItem Content = "Orange" />
      </ComboBox>
		
      <TextBox Name = "textBox" Margin = "50" Width = "100" 
         Height = "23" VerticalAlignment = "Top" Text = "{
         Binding ElementName = comboBox, Path = SelectedItem.Content, 
         Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}" 
         Background = "{Binding ElementName = comboBox, Path = SelectedItem.Content}"> 
      </TextBox>
   </StackPanel>
	
</Window>

当应用程序执行时,它将显示实时可视化树,其中所有元素都显示在树中。

视觉树

此实时可视化树显示了完整的布局结构,以了解 UI 元素的放置位置。但此选项仅在 Visual Studio 2015 中可用。如果您使用的是旧版本的 Visual Studio,则无法使用此工具;然而,还有另一种工具可以与 Visual Studio 集成,例如 XAML Spy for Visual Studio。您可以从http://xamlspy.com/download下载它。如果您使用的是旧版本的 Visual Studio,我们建议您下载此工具。