XAML中的语法概述

XAML:是一种声明性标记语言,主要作用就是创建可见的UI元素,这样的话,就能更好的实现页面的前台UI显示代码,与后台业务逻辑代码的分离。

XAML中的对象元素:类似于XML中的每一个节点
<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

但是唯一的不同就是:在XAML中每一个节点都对应有相应的类(这些类都是在WPF的程序集中存在的)这种自动的映射,使其在XAML中出现一个节点就相当于在此页面实例化了一个对象。

特性语法(属性)
<Button Background="Blue" Foreground="Red" Content="This is a button"/> 将值直接赋给了属性:(这里的属性相当于类Button的属性)

属性元素语法
<Button>
  <Button.Background>
    <SolidColorBrush Color="Blue"/>
  </Button.Background>
  <Button.Foreground>
    <SolidColorBrush Color="Red"/>
  </Button.Foreground>
  <Button.Content>
    This is a button
  </Button.Content>
</Button> 类似于以上特性语法的作用,不过是为了解决有些无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。

集合语法

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->
    <GradientStop Offset="0.0" Color="Red" />
    <GradientStop Offset="1.0" Color="Blue" />
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

★内容属性

设置内容属性时可省略该属性元素,并在标记中生成更直观的父级/子级形式。

<Button>btn1</Button> 这里的语法省略了,原来应该是这样的:

<Button content='btn1' />

为什么能够省略呢:是因为任何一个类都可以指定一个且仅有一个属性为该XAML的内容属性,而作为Button类,他继承自类:ContentControl,而该类的一个属性:Content就设置为该类的一个内容属性,因此就可以省略。

那么怎样设置内容属性呢?就是在包含有该属性的类的上方设置上标签[ContentPropertyAttribute("属性名")]即可,

例:[LocalizabilityAttribute(LocalizationCategory.Ignore, Readability = Readability.Unreadable)]
[ContentPropertyAttribute("Child")]
public class Decorator : FrameworkElement, IAddChild

就将类Decorator类的属性Child设置为内容属性。

 

内容属性和集合语法组合

<StackPanel>
  <Button>First Button</Button>
  <Button>Second Button</Button>
</StackPanel>

以上代码部分省略, 完整的为:

<StackPanel>

<StackPanel.Children>

<!--<UIElementCollection>-->//UIElementCollection是StackPanel.Children属性采用的类型,因此按照语法规定应该为此在此声明一个这样的类

                                           //但是UIElementCollection没有默认的构造函数,无法实例化,所以是不需要的

<Button>first button</Button>  

<Button>Second button</Button>     //传说中的具有内容属性的类才可使用的文本内容。

<!--<UIElementCollection>-->

</StackPanel.Children>

</StackPanel>

特性语法(事件)

 <Button Click="Button_Click" >Click Me!</Button>

标记将 click 事件的一个处理程序指定给在标记中创建的 Button

----------------------------------------------------------------------

 

标记扩展

用于提供特性语法的值,{}表示标记扩展用法,用于区分一般的特性语法的文本值类型:

常用在:Binding(用于数据绑定表达式)以及资源引用 StaticResourceDynamicResource
<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>


...


</Page.Resources>
<StackPanel>
  <Border Style="{StaticResource PageBackground}">   //引用以前在资源字典中作为键控资源进行实例化的某个样式(也就是上面的值)


...


  </Border>
</StackPanel>

XAML 根元素和 XAML 命名空间

任何一个XAML文档都只能有一个根元素,如<page>....</page>,<Window></Widow>

命名空间:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"


...
</Page>

默认情况下,使用不指定前缀的命名空间xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation进行映射

而当有了前缀X:时使用:xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml

  • x:Key:为 ResourceDictionary(或其他框架中的类似字典概念)中的每个资源设置唯一的键。在典型的 WPF 应用程序标记中的所有 x: 用法中,x:Key 将可能占到 90%。

  • x:Class:向为 XAML 页提供代码隐藏的类指定 CLR 命名空间和类名。必须具有这样一个类才能支持每个 WPF 编程模型的代码隐藏,而正是因此,即使没有资源,也几乎总是能看���映射的 x:

  • x:Name:处理对象元素后,为运行时代码中存在的实例指定运行时对象名称。通常,您将为 x:Name 经常使用 WPF 定义的等效属性。此类属性特定映射到 CLR 后备属性,因此更便于进行应用程序编程,在应用程序编程中,您经常使用运行时代码从初始化的 XAML 中查找命名元素。最常见的此类属性是 FrameworkElement.Name在特定类型中不支持等效的 WPF 框架级Name 属性时,仍然可以使用 x:Name某些动画方案中会发生这种情况。

  • x:Static:启用一个返回静态值的引用,该静态值只能是一个 XAML 兼容属性。

  • x:Type:根据类型名称构造一个 Type 引用。它用于指定采用 Type(例如 Style.TargetType)的特性,但属性经常具有本机的字符串到 Type 的转换功能,因此使用 x:Type 标记扩展用法是可选的。


  • 自定义前缀:

     <Page
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"
        >
      <StackPanel Name="LayoutRoot">
        <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>
    ...</StackPanel>
    </Page>

    详细介绍参见msdn:http://msdn.microsoft.com/zh-cn/library/ms752059.aspx

     

    原文地址:https://www.cnblogs.com/lxy131/p/1782304.html