XAML(eXtensible Application Markup Language,可扩展应用程序标记语言)是一种声明式的编程语言,遵循XML的语法。WPF使用XAML来设计UI具有易用性、高效性等特点。易用性主要表现在设计师在不需懂逻辑代码的情况下就可以使用Expression Blend设计出优雅的界面以及一些动画效果。我们将分两个大的部分来说明,一个是XAML基本认识,另一个是XAML中最重要的X命名空间。

1.XAML基本认识

下面我们新建一个WPF应用程序,看看Xaml页面有哪些基本的东西

从上图我们可以看出Xaml有一个根元素Window,根元素下有一个子元素Grid,表示出清晰的层级关系。Window还有一些属性(Attribute):

x:Class属于x命名空间的内容,我们后面详述

xmlns是XML Namespace的缩写,等号后面看起来像一个URL,其实是采用硬编码(Hard Code)的形式来引用一些.net命名空间。

如果要引用多个命名空间,为了区别,我们可以用标识前缀来限定修饰,如xmlns:x

Tilte、Height、Width属性用来修饰Window

1.1集合语法

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525">
  5. <Grid>
  6. <Ellipse Width="80" Height="80">
  7. <Ellipse.Fill>
  8. <RadialGradientBrush GradientOrigin="0.5,0.5">
  9. <RadialGradientBrush.GradientStops>
  10. <GradientStop Offset="0" Color="Red" />
  11. <GradientStop Offset="0.6" Color="Green" />
  12. <GradientStop Offset="1" Color="Blue" />
  13. </RadialGradientBrush.GradientStops>
  14. </RadialGradientBrush>
  15. </Ellipse.Fill>
  16. </Ellipse>
  17. </Grid>
  18. </Window>

RadialGradientBrush.GradientStops是一个GradientStop集合,我们可以像上面那样来编写

1.2Xaml内容属性

XAML 指定了一个语言功能,通过该功能,一个类可以指定它的一个且仅一个属性为 XAML 内容属性。 该对象元素的子元素用于设置该内容属性的值。 换言之,仅对内容属性而言,您可以在 XAML 标记中设置该属性时省略属性元素,并在标记中生成更直观的父级/子级形式。本文刚开始给了一张图片,在Window下放了一个Grid,其实它的完整写法应该是这样:

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525">
  5. <Window.Content>
  6. <Grid>
  7.  
  8. </Grid>
  9. </Window.Content>
  10. </Window>

由上面代码知道,Content属性是Window的默认内容属性,因此你可以直接省略它,这样看起来更直观。

1.3文本内容

有少量 XAML 元素可直接将文本作为其内容来处理。 若要实现此功能,必须满足以下条件之一:

1.类必须声明一个内容属性,并且该内容属性必须是可赋值给字符串的类型(该类型可以是 Object)。

2. 类型必须声明一个类型转换器,该类型转换器将文本内容用作其初始化文本。 例如,<Brush>Blue</Brush>。 这种情况实际上并不常见。

3.类型必须为已知的 XAML 语言基元。

我们来举个例子看看:

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525">
  5. <Window.Content>
  6. <Grid>
  7. <Grid.RowDefinitions>
  8. <RowDefinition Height="100" />
  9. <RowDefinition Height="5" />
  10. <RowDefinition Height="100" />
  11. </Grid.RowDefinitions>
  12. <Grid.ColumnDefinitions>
  13. <ColumnDefinition Width="100" />
  14. <ColumnDefinition Width="5" />
  15. <ColumnDefinition Width="100" />
  16. </Grid.ColumnDefinitions>
  17. <Ellipse Width="80" Height="80">
  18. <Ellipse.Fill>
  19. <RadialGradientBrush GradientOrigin="0.5,0.5">
  20. <RadialGradientBrush.GradientStops>
  21. <GradientStop Offset="0" Color="Red" />
  22. <GradientStop Offset="0.6" Color="Green" />
  23. <GradientStop Offset="1" Color="Blue" />
  24. </RadialGradientBrush.GradientStops>
  25. </RadialGradientBrush>
  26. </Ellipse.Fill>
  27. </Ellipse>
  28. <Button Grid.Column="2">
  29. Button
  30. <Button.Background>
  31. Red
  32. </Button.Background>
  33. </Button>
  34. </Grid>
  35. </Window.Content>
  36. </Window>

上面代码中Button有一个Content内容属性(可省略书写),其类型为Object,满足第一条;

Background属性是Brush类型,它是一个抽象类,系统内置有其子类SolidColorBrush类型转化器,故将会把Red文本(对应的#FF0000这种RGB文本值也可以)转换为SolidColorBrush类型,满足第二条,所以可以写成上面那样。

1.4自定义TypeConverter

上面我们知道,WPF内置许多的TypeConverter,使得我们在使用Xaml时能够随心所欲。下面我们也得实现一个TypeConverter:

首先创建一个Person类:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using XamlDemo;
  6. using System.ComponentModel;
  7.  
  8. namespace XamlDemo
  9. {
  10. [TypeConverter(typeof(StringToPersonTypeConverter))]
  11. public class Person
  12. {
  13. public string Name { get; set; }
  14. public Person Child { get; set; }
  15. }
  16. }

然后创建一个继承自TypeConverter的StringToPersonTypeConverter,重写里面的ConvertFrom方法:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ComponentModel;
  6.  
  7. namespace XamlDemo
  8. {
  9. class StringToPersonTypeConverter:TypeConverter
  10. {
  11. public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
  12. {
  13. if (value is string)
  14. {
  15. Person p = new Person();
  16. p.Name = value.ToString();
  17. return p;
  18. }
  19. return base.ConvertFrom(context, culture, value);
  20. }
  21. }
  22. }

然后在Xaml中使用:

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:local="clr-namespace:XamlDemo"
  5. Title="MainWindow" Height="350" Width="525">
  6. <Window.Resources>
  7. <Style TargetType="{x:Type TextBlock}">
  8. <Setter Property="FontSize" Value="20" />
  9. </Style>
  10. <XmlDataProvider x:Key="xdp1" XPath="Students/Student">
  11. <x:XData>
  12. <Students xmlns="">
  13. <Student Name="Jello"/>
  14. <Student Name="Taffy"/>
  15. </Students>
  16. </x:XData>
  17. </XmlDataProvider>
  18. <local:Person x:Key="person1" Child="Jello" />
  19. </Window.Resources>
  20. <Window.Content>
  21. <StackPanel x:Name="stackpanel1">
  22. <Grid>
  23. <Grid.RowDefinitions>
  24. <RowDefinition Height="100" />
  25. <RowDefinition Height="5" />
  26. <RowDefinition Height="100" />
  27. <RowDefinition Height="5" />
  28. <RowDefinition Height="100" />
  29. </Grid.RowDefinitions>
  30. <Grid.ColumnDefinitions>
  31. <ColumnDefinition Width="100" />
  32. <ColumnDefinition Width="5" />
  33. <ColumnDefinition Width="100" />
  34. <ColumnDefinition Width="5" />
  35. <ColumnDefinition Width="100" />
  36. </Grid.ColumnDefinitions>
  37. <Ellipse Width="80" Height="80">
  38. <Ellipse.Fill>
  39. <RadialGradientBrush GradientOrigin="0.5,0.5">
  40. <RadialGradientBrush.GradientStops>
  41. <GradientStop Offset="0" Color="Red" />
  42. <GradientStop Offset="0.6" Color="Green" />
  43. <GradientStop Offset="1" Color="Blue" />
  44. </RadialGradientBrush.GradientStops>
  45. </RadialGradientBrush>
  46. </Ellipse.Fill>
  47. </Ellipse>
  48. <Button Grid.Column="2">
  49. Button
  50. <Button.Background>
  51. #FF0000
  52. </Button.Background>
  53. </Button>
  54. <TextBlock x:Name="txtblock1" Grid.Row="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  55. <TextBlock Name="txtblock2" Grid.Row="2" Grid.Column="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  56. <TextBlock Text="{Binding Path=Text,ElementName=myTextBlock1}" Background="{x:Static Member=SystemColors.GrayTextBrush}" Style="{x:Null}" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  57. <ListBox Grid.Column="2" Grid.Row="4" ItemsSource="{Binding Source={StaticResource xdp1}}" DisplayMemberPath="@Name"/>
  58. </Grid>
  59. <local:MyTextBlock Text="Hello" x:Name="myTextBlock1"/>
  60. <local:MyTextBlock Text="Hello"/>
  61. </StackPanel>
  62. </Window.Content>
  63. </Window>

后台代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14.  
  15. namespace XamlDemo
  16. {
  17. /// <summary>
  18. /// MainWindow.xaml 的交互逻辑
  19. /// </summary>
  20. public partial class MainWindow : Window
  21. {
  22. public MainWindow()
  23. {
  24. InitializeComponent();
  25. this.txtblock1.Text = "World";
  26. this.txtblock2.Text = "World";
  27.  
  28. //有x:Name修饰的MyTextBlock
  29. this.myTextBlock1.Text = "World";
  30. MessageBox.Show(this.myTextBlock1.Text);
  31.  
  32. //无x:Name修饰的MyTextBlock
  33. MyTextBlock myTextBlock = this.stackpanel1.Children[] as MyTextBlock;
  34. if (myTextBlock != null)
  35. {
  36. myTextBlock.Text = "World";
  37. MessageBox.Show(myTextBlock.Text);
  38. }
  39.  
  40. //自定义TypeConverter
  41. Person p = this.FindResource("person1") as Person;
  42. if (p != null)
  43. {
  44. MessageBox.Show(p.Child.Name);
  45. }
  46. }
  47. }
  48. }

这样,我们简单实现了一个TypeConverter。

2.x命名空间

由上面我们知道,xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"这个就是x命名空间,命名成x不是必须得,当然也可以命名成xmlns:y="http://schemas.microsoft.com/winfx/2006/xaml",这里只是约定而已(命名为x代表这是Xaml相关的命名空间)。我们来下里面都有些什么:

有上图可以看出x命名空间中主要有Attribute、标记扩展和指令元素三种。下面我们将分别看下具体使用:

2.1Attribute

我们拿最常使用的x:Name来看下:

Xaml代码:

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525">
  5. <Window.Content>
  6. <Grid>
  7. <Grid.RowDefinitions>
  8. <RowDefinition Height="100" />
  9. <RowDefinition Height="5" />
  10. <RowDefinition Height="100" />
  11. </Grid.RowDefinitions>
  12. <Grid.ColumnDefinitions>
  13. <ColumnDefinition Width="100" />
  14. <ColumnDefinition Width="5" />
  15. <ColumnDefinition Width="100" />
  16. </Grid.ColumnDefinitions>
  17. <Ellipse Width="80" Height="80">
  18. <Ellipse.Fill>
  19. <RadialGradientBrush GradientOrigin="0.5,0.5">
  20. <RadialGradientBrush.GradientStops>
  21. <GradientStop Offset="0" Color="Red" />
  22. <GradientStop Offset="0.6" Color="Green" />
  23. <GradientStop Offset="1" Color="Blue" />
  24. </RadialGradientBrush.GradientStops>
  25. </RadialGradientBrush>
  26. </Ellipse.Fill>
  27. </Ellipse>
  28. <Button Grid.Column="2">
  29. Button
  30. <Button.Background>
  31. #FF0000
  32. </Button.Background>
  33. </Button>
  34. <TextBlock x:Name="txtblock1" Grid.Row="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  35. <TextBlock Name="txtblock2" Grid.Row="2" Grid.Column="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  36. </Grid>
  37. </Window.Content>
  38. </Window>

后台代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14.  
  15. namespace XamlDemo
  16. {
  17. /// <summary>
  18. /// MainWindow.xaml 的交互逻辑
  19. /// </summary>
  20. public partial class MainWindow : Window
  21. {
  22. public MainWindow()
  23. {
  24. InitializeComponent();
  25. this.txtblock1.Text = "World";
  26. this.txtblock2.Text = "World";
  27. }
  28. }
  29. }

运行发现两个TextBlock的文本显示都变成了World,那我们不经要问x:Name和Name有什么区别呢?我们知道TextBlock的Name属性是从FrameworkElement类中继承的,用于引用标签对应的实例,和ASPX中重的ID作用差不多,当一个标签或者自定义元素不是继承自FrameworkElement时,就无法获取它的Name属性了,这将导致在后台中访问该标签变得麻烦。我们举个例子来看下:

首先我们自定义一个继承自UIElement的MyTextBlock类,只有一个Text属性。

然后我们在Xaml中引用它,需要在根元素中加入xmlns:local="clr-namespace:XamlDemo",代码如下:

Xaml代码:

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:local="clr-namespace:XamlDemo"
  5. Title="MainWindow" Height="350" Width="525">
  6. <Window.Content>
  7. <StackPanel>
  8. <Grid>
  9. <Grid.RowDefinitions>
  10. <RowDefinition Height="100" />
  11. <RowDefinition Height="5" />
  12. <RowDefinition Height="100" />
  13. <RowDefinition Height="5" />
  14. <RowDefinition Height="100" />
  15. </Grid.RowDefinitions>
  16. <Grid.ColumnDefinitions>
  17. <ColumnDefinition Width="100" />
  18. <ColumnDefinition Width="5" />
  19. <ColumnDefinition Width="100" />
  20. <ColumnDefinition Width="5" />
  21. <ColumnDefinition Width="100" />
  22. </Grid.ColumnDefinitions>
  23. <Ellipse Width="80" Height="80">
  24. <Ellipse.Fill>
  25. <RadialGradientBrush GradientOrigin="0.5,0.5">
  26. <RadialGradientBrush.GradientStops>
  27. <GradientStop Offset="0" Color="Red" />
  28. <GradientStop Offset="0.6" Color="Green" />
  29. <GradientStop Offset="1" Color="Blue" />
  30. </RadialGradientBrush.GradientStops>
  31. </RadialGradientBrush>
  32. </Ellipse.Fill>
  33. </Ellipse>
  34. <Button Grid.Column="2">
  35. Button
  36. <Button.Background>
  37. #FF0000
  38. </Button.Background>
  39. </Button>
  40. <TextBlock x:Name="txtblock1" Grid.Row="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  41. <TextBlock Name="txtblock2" Grid.Row="2" Grid.Column="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  42. </Grid>
  43. <local:MyTextBlock Text="Hello" x:Name="myTextBlock1"/>
  44. <local:MyTextBlock Text="Hello"/>
  45. </StackPanel>
  46. </Window.Content>
  47. </Window>

后台代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14.  
  15. namespace XamlDemo
  16. {
  17. /// <summary>
  18. /// MainWindow.xaml 的交互逻辑
  19. /// </summary>
  20. public partial class MainWindow : Window
  21. {
  22. public MainWindow()
  23. {
  24. InitializeComponent();
  25. this.txtblock1.Text = "World";
  26. this.txtblock2.Text = "World";
  27.  
  28. //有x:Name修饰的MyTextBlock
  29. this.myTextBlock1.Text = "World";
  30. MessageBox.Show(this.myTextBlock1.Text);
  31.  
  32. //无x:Name修饰的MyTextBlock
  33. MyTextBlock myTextBlock = this.stackpanel1.Children[] as MyTextBlock;
  34. if (myTextBlock != null)
  35. {
  36. myTextBlock.Text = "World";
  37. MessageBox.Show(myTextBlock.Text);
  38. }
  39. }
  40. }
  41. }

其实,x:Name的作用有两个:一是为标签生成对应的实例并可以用x:Name的值引用它;二是如果这个标签继承自FrameworkElement类,那么也让其Name属性来引用生成的实例。

2.2标记扩展

Xaml标记扩展对应System.Window.Markup.MarkupExtension抽象类,查看它的子类,点击这里

举个例子来说明它的用法:

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:local="clr-namespace:XamlDemo"
  5. Title="MainWindow" Height="350" Width="525">
  6. <Window.Content>
  7. <StackPanel x:Name="stackpanel1">
  8. <Grid>
  9. <Grid.RowDefinitions>
  10. <RowDefinition Height="100" />
  11. <RowDefinition Height="5" />
  12. <RowDefinition Height="100" />
  13. <RowDefinition Height="5" />
  14. <RowDefinition Height="100" />
  15. </Grid.RowDefinitions>
  16. <Grid.ColumnDefinitions>
  17. <ColumnDefinition Width="100" />
  18. <ColumnDefinition Width="5" />
  19. <ColumnDefinition Width="100" />
  20. <ColumnDefinition Width="5" />
  21. <ColumnDefinition Width="100" />
  22. </Grid.ColumnDefinitions>
  23. <Ellipse Width="80" Height="80">
  24. <Ellipse.Fill>
  25. <RadialGradientBrush GradientOrigin="0.5,0.5">
  26. <RadialGradientBrush.GradientStops>
  27. <GradientStop Offset="0" Color="Red" />
  28. <GradientStop Offset="0.6" Color="Green" />
  29. <GradientStop Offset="1" Color="Blue" />
  30. </RadialGradientBrush.GradientStops>
  31. </RadialGradientBrush>
  32. </Ellipse.Fill>
  33. </Ellipse>
  34. <Button Grid.Column="2">
  35. Button
  36. <Button.Background>
  37. #FF0000
  38. </Button.Background>
  39. </Button>
  40. <TextBlock x:Name="txtblock1" Grid.Row="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  41. <TextBlock Name="txtblock2" Grid.Row="2" Grid.Column="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  42. <TextBlock Text="{Binding Path=Text,ElementName=myTextBlock1}" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  43. </Grid>
  44. <local:MyTextBlock Text="Hello" x:Name="myTextBlock1"/>
  45. <local:MyTextBlock Text="Hello"/>
  46. </StackPanel>
  47. </Window.Content>
  48. </Window>

上面代码只是多加了一个TextBlock,看起来奇怪的是它的Text、Background和Style属性的值,是用一对大括号来包括的,这就是我们要说的标记扩展。

构造语法:{标记扩展类 [可选参数]},可选参数包括命名参数和定位参数。

标记扩展类:x:Null、x:Static和Binding;

命名参数:Binding中的Path和Element;

定位参数:x:Static中Member

这里还有一个{}转义序列的问题,请点击这里

2.3指令元素

主要就两个x:XData和x:Code,这里举个x:XData例子:

  1. <Window x:Class="XamlDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:local="clr-namespace:XamlDemo"
  5. Title="MainWindow" Height="350" Width="525">
  6. <Window.Resources>
  7. <Style TargetType="{x:Type TextBlock}">
  8. <Setter Property="FontSize" Value="20" />
  9. </Style>
  10. <XmlDataProvider x:Key="xdp1" XPath="Students/Student">
  11. <x:XData>
  12. <Students xmlns="">
  13. <Student Name="Jello"/>
  14. <Student Name="Taffy"/>
  15. </Students>
  16. </x:XData>
  17. </XmlDataProvider>
  18. </Window.Resources>
  19. <Window.Content>
  20. <StackPanel x:Name="stackpanel1">
  21. <Grid>
  22. <Grid.RowDefinitions>
  23. <RowDefinition Height="100" />
  24. <RowDefinition Height="5" />
  25. <RowDefinition Height="100" />
  26. <RowDefinition Height="5" />
  27. <RowDefinition Height="100" />
  28. </Grid.RowDefinitions>
  29. <Grid.ColumnDefinitions>
  30. <ColumnDefinition Width="100" />
  31. <ColumnDefinition Width="5" />
  32. <ColumnDefinition Width="100" />
  33. <ColumnDefinition Width="5" />
  34. <ColumnDefinition Width="100" />
  35. </Grid.ColumnDefinitions>
  36. <Ellipse Width="80" Height="80">
  37. <Ellipse.Fill>
  38. <RadialGradientBrush GradientOrigin="0.5,0.5">
  39. <RadialGradientBrush.GradientStops>
  40. <GradientStop Offset="0" Color="Red" />
  41. <GradientStop Offset="0.6" Color="Green" />
  42. <GradientStop Offset="1" Color="Blue" />
  43. </RadialGradientBrush.GradientStops>
  44. </RadialGradientBrush>
  45. </Ellipse.Fill>
  46. </Ellipse>
  47. <Button Grid.Column="2">
  48. Button
  49. <Button.Background>
  50. #FF0000
  51. </Button.Background>
  52. </Button>
  53. <TextBlock x:Name="txtblock1" Grid.Row="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  54. <TextBlock Name="txtblock2" Grid.Row="2" Grid.Column="2" Text="Hello" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  55. <TextBlock Text="{Binding Path=Text,ElementName=myTextBlock1}" Background="{x:Static Member=SystemColors.GrayTextBrush}" Style="{x:Null}" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  56. <ListBox Grid.Column="2" Grid.Row="4" ItemsSource="{Binding Source={StaticResource xdp1}}" DisplayMemberPath="@Name"/>
  57. </Grid>
  58. <local:MyTextBlock Text="Hello" x:Name="myTextBlock1"/>
  59. <local:MyTextBlock Text="Hello"/>
  60. </StackPanel>
  61. </Window.Content>
  62. </Window>

3.总结

这次主要是介绍Xaml相关的内容,讲的都是一些基础。自己在手写的过程,也重拾了已经遗忘的知识!

4.参考文献

1.MSDN(http://msdn.microsoft.com/zh-cn/library/ms754130%28v=vs.110%29.aspx)

2.深入浅出WPF(刘铁猛)

3.WPF高级编程

5.Xaml编译(补充内容)

Xaml的编译主要做三件事:

  1.转换为特殊的二进制格式Baml

  2.将Baml作为二进制资源嵌入程序集

  3.将Xaml和过程式代码链接起来

WPF学习(2)XAML的更多相关文章

  1. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  2. 学习WPF——了解WPF中的XAML

    XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Butt ...

  3. WPF学习05:2D绘图 使用Transform进行控件变形

    在WPF学习04:2D绘图 使用Shape绘基本图形中,我们了解了如何绘制基本的图形. 这一次,我们进一步,研究如何将图形变形. 例子 一个三角形,经Transform形成组合图形: XAML代码: ...

  4. WPF学习之资源-Resources

    WPF学习之资源-Resources WPF通过资源来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等,而在其支持上也更能体现出这些资源定义的优越性.比如通过Resour ...

  5. WPF学习之路初识

    WPF学习之路初识   WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...

  6. WPF学习拾遗(二)TextBlock换行

    原文:WPF学习拾遗(二)TextBlock换行 下午在帮组里的同事解决一个小问题,为了以后方便,把就把它收集一下吧. 新建一个TextBlock作为最基础的一个控件,他所携带的功能相对于其他的控件要 ...

  7. WPF学习(8)数据绑定

    说到数据绑定,其实这并不是一个新的玩意儿.了解asp.net的朋友都知道,在asp.net中已经用到了这个概念,例如Repeater等的数据绑定.那么,在WPF中的数据绑定相比较传统的asp.net中 ...

  8. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  9. (转)WPF学习资源整理

    由于笔者正在学习WPF,所以整理出网络中部分WPF的学习资源,希望对同样在学习WPF的朋友们有所帮助. 首推刘铁猛的<深入浅出WPF>系列博文 1.深入浅出WPF(1)——什么是WPFht ...

  10. WPF学习资源整理

    WPF(WindowsPresentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型 ...

随机推荐

  1. 探索Oracle数据库升级6 11.2.0.4.3 Upgrade12c(12.1.0.1)

    探索Oracle数据库升级6 11.2.0.4.3 Upgrade12c(12.1.0.1) 一.前言:       Oracle 12c公布距今已经一年有余了,其最大亮点是一个能够插拔的数据库(PD ...

  2. 为应用程序池“XX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误

    场景 WCF应用程序部署在IIS7中,使用net.tcp协议对外给几百台客户端提供服务,应用程序池不断崩溃重启. 分析过程 在事件查看器中看到的错误信息类似于 为应用程序池“XX”提供服务的进程在与 ...

  3. TP-LINK telnet远程 重启路由器(转)

    突然断网,以前房东的路由器管理页面可以打开,今天突然间就打不开了.ping了下,可以ping通,于是就想起了房东的路由器是TP-LINK的 可以 telnet登陆的.每次,断网,我都会重启房东的路由器 ...

  4. Cocos2d-x 脚本语言Lua中的面向对象

    Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类 ...

  5. sensor调试过程HAL层数据不能被转移到app

    最近调试e-compass传感器,我遇到了一个奇怪的问题,驱动器正常报告数据.但该数据到HAL后该层已经无法上传app. 经debug,我发现这是一个供应商派的代码存在bug,open的fd没有设置N ...

  6. 全文检索引擎Solr 指南

    全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T

  7. gradle下载(转)

    http://services.gradle.org/distributions services.gradle.org/ distributions/ gradle-2.2.1-rc-1-all.z ...

  8. C++ 习题 输出日期时间--友元函数

    Description 设计一个日期类和时间类,编写display函数用于显示日期和时间.要求:display函数作为类外的普通函数,分别在Time和Date类中将display声明为友元函数.在主函 ...

  9. 【C语言探索之旅】 第二部分第七课:文件读写

    内容简介 1.课程大纲 2.第二部分第七课: 文件读写 3.第二部分第八课预告: 动态分配 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏 ...

  10. __weak如何实现目标值自己主动设置nil的

    在开始评论__weak机制之前,首先,一些床上用品 ARC 实现 苹果公司的官方介绍说,.ARC这是"内存管理由编译器"的,但事实上,只有编译器不能完全胜任,ARC另外还要看OC执 ...