深入浅出WPF笔记——X名称空间详解

 

 

 

 

 

 

 

深入浅出WPF笔记——X名称空间详解

“x”名称空间的成员引导XAML编译器将XAML编译成CLR代码 “x”就XAML首字母。凡包含XAML代码的WPF程序都需要通过语句 xmlns: x="http:// schemas.microsoft.com/winfx/ 2006/xaml"引入。此名称空间是程序员与XAML编译器沟通的工具。

x名称空间都有什么东东

x名称空间有Attribute标记扩展XAML指令元素组成。如下表。

名称种类(XAML出现的形式)
x:Array,x:Null,x:Static,x:Type标记扩展
x:Code,x:XDataXAML指令元素
x:Key,x:Name,x:Class,x:FeildModiferAttribute
x:ClassModifer,x:Shared,x:TypeArgument,x:UidAttribute

Attribute

Attribute:语言层面的东西, 是给编译器看的。
Property:对象上面的东西,是给编程逻辑用的。
XAML标签的Attribute大部分对应对象的Property。在XAML编程中,你想添加特殊的标记从而影响XAML编译器的解析,这时候就要添加一些Attribute了。

<window x:Class="ClassName">
<!--告诉XAML编译器将编译结果与哪个C#编译的类合并-->
</window>

x:Class

x:Class告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。在使用时遵循以下要求:

  • 只能用于根结点(如:window、UserControl)
  • 使用x:Class的根结点的类型与x:Class的值所指示的类型保持一致
  • x:Class所指示的类型在声明时必须用partial关键字

x:ClassModifier

x:ClassModifier告诉XAML编译器标签编译生成类的访问级别。这个Attribute需要注意以下几点:

  • 标签必须具有x:Class
  • x:ClassModifier值与x:Class`所指类的访问级别一致
  • x:ClassModifier与后台代码的不同而不同,参见TypeAttributes
    例:x:ClassModifier="internal"

x:Name

x:Name给标签对象起个名子,也就是生成对象实例并为它声明一个引用变量,通过这个变量方便C#代码调用这个实例。
注意:

  • 如果一个标签的对象有Name属性,为方便查找将x:NameName赋值相同并注册在UI树上。
  • Name属性WPF控件的基类属性,所有控件都有Name属性。
  • 当一个对象有Name属性,使用x:NameName等同。为提高代码统一性,统一使用x:Name
<StackPanel>
        <Button x:Name="button1" Margin="5"/>
        <TextBox x:Name="textBox1" Margin="5"/>
 </StackPanel>

x:FeildModifier

x:FeildModifier改变引用变量的访问级别。使用前必须通过x:Name声明引用变量。

<Button x:Name="btn1" x:FeildModifier="public" Content="Click Me" />

x:Key

x:KeyResource(资源)检索的索引。

    <Window.Resources>
        <sys:String x:Key="Hello World">Hello World!</sys:String>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{StaticResource ResourceKey=Hello World}"/>
    </StackPanel>

x:Shared

x:Sharedx:Key配合使用。当x:Shared="true"通过x:Key检索的对象为同一个对象。如果x:Sharp="false"通过x:Key检索的对象是此对象的新副本。

标记扩展

标记扩展(Markup Extension)实际上就是MarkupExtension类直接或间接的派生类。

x:Type

x:Type的值代表一个数据类型的名称。一般情况下,我们在编程中操作着数据类型的实例或是实例的引用。但有些时候我们还会用到数据类型本身。

在XAML中表达一个数据类型就要用到x:Type。比如一个类的属性是一个数据类型,当给此类赋值时。引用一下书中的例子

首先创建一个Button的派生类MyButton,里面包含一个名为UserWindowType的Type类型的属性。

    public class MyButton : Button
    {
        public Type UserWindowType { get; set; }

        protected override void OnClick()
        {
            base.OnClick();
            Window win = Activator.CreateInstance(this.UserWindowType) as Window;
            if (win != null)
            {
                win.ShowDialog();
            }
        }
    }

然后创建一个Window的一个派生类MyWindow

<Window x:Class="SamplesForWPF.MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SamplesForWPF"
        mc:Ignorable="d"
        Title="MyWindow" Height="150" Width="300">
    <StackPanel Background="LightBlue">
        <TextBox Margin="5"/>
        <TextBox Margin="5"/>
        <TextBox Margin="5"/>
        <Button Content="OK" Margin="5"/>
    </StackPanel>
</Window>

最后把自定义按键MyButton放在主窗口,并将MyWindow赋值给MyButton.UserWindowType

<Window x:Class="SamplesForWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SamplesForWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">
    <StackPanel Background="LightBlue">
        <local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/>
    </StackPanel>
</Window>

TypeExtension类的构造器支持类型名参数,所以可以写成

UserWindowType="{x:Type local:MyWindow}"

x:Null

x:Null与C#的Null意义相同,代表一个空值。在XAML中,如果给某个对象的属性赋一个空值,我们可以这样写

<Button Content="OK" Style="{x:Null}"/>

标记扩展的两种声明语法

常用的方法用朱{}括起来

<Button Content="OK" Style="{x:Null}"/>

另外一种语法如下

<Button Content="OK">
    <Button.Style>
        <x:Null/>
    </Button.Style>
</Button>

大多数情况我们都会使用第一种语法,看起不来简洁明了。有一个另外,就是x:Array

x:Array

x:Array的作用就是通过它Items属性向使用者暴露一个类型已知的ArrayList。ArrayList的成员类型由x:Array的Type属性指明。

<ListBox Margin="5" ItemsSource="{x:Array Type=sys:String}"/>

一个String类型的ArrayList作为Data Source赋给了ListBox。此时的ArrayList是一个空的,我们要通个下面的代码向Items添加数据

          <ListBox Margin="5">
            <ListBox.ItemsSource>
                <x:Array Type="sys:String">
                    <sys:String>张三</sys:String>
                    <sys:String>李四</sys:String>
                </x:Array>
            </ListBox.ItemsSource>
        </ListBox>

在解析< x: Array>标签 的 时候编译器会生成调用AddChild方法的代码把< x: Array>标签 的子元素逐个添加到x: Array实例的Items里。

x:Static

x:Static是用来使用XAML文档中数据类型的静态成员。XAML不能编写逻辑代码,所以使用x:Static访问数据类型的静态成员一定是属性字段。引用书中的例子

   public partial class MainWindow : Window
   {
       public static string WindowTitle = "山高月小";
       public static string ShowText { get { return "水落石出"}; }

       public MainWindow()
       {
           InitializeComponent();
       }
   }

然后用x:Static访问MainWindow.ShowText

<Window x:Class="SamplesForWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SamplesForWPF"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">
    <StackPanel Background="LightBlue">
        <TextBlock Text="{x:Static local:MainWindow.ShowText}"/>
    </StackPanel>
</Window>

运行结果

XAML指令元素

XAML指令元素只有两个,x:Code,x:XData

x:Code

x:Code作用是可以包含本应后置的C#代码。

x:XData

x:XData是一个专用标签。数据提供者XmlDataProvider的实例放在x:XData内容里。

引用书中实例

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入浅出WPF(Windows Presentation Foundation)是一本介绍WPF的书籍,适合初学者。本书共分为以下几章: 第一章:WPF简介 这一章主要介绍WPF的背景和优势,以及与传统的Windows Forms应用程序开发的对比。 第二章:XAML基础 XAML(可扩展应用程序标记语言)是WPF的核心,本章通过一些简单的示例介绍XAML的基本概念和语法。 第三章:WPF控件 WPF提供了丰富的控件,本章依次介绍了常用的Button、TextBox、ComboBox和ListBox等控件的用法和属性。 第四章:布局和容器 WPF的布局和容器可以帮助我们更好地管理和组织控件,本章详细介绍了Grid、StackPanel和WrapPanel等布局和容器的使用。 第五章:数据绑定 数据绑定是WPF的重要特性之一,可以实现数据和UI之间的自动同步,本章通过示例演示了常见的数据绑定方式。 第六章:样式和模板 WPF的样式和模板可以帮助我们更好地定制和美化应用程序的外观,本章介绍了如何定义和应用样式和模板。 第七章:命令和事件 WPF的命令和事件机制是实现交互的重要手段,本章介绍了如何定义和使用命令,以及如何处理事件。 第八章:动画和效果 WPF提供了强大的动画和效果功能,可以使应用程序更加生动和吸引人,本章介绍了常用的动画和效果的实现方式。 第九章:MVVM架构 MVVM(Model-View-ViewModel)是一种经典的软件架构模式,在WPF开发中被广泛应用,本章介绍了MVVM的基本原理和实现方式。 第十章:高级主题 本章涵盖了一些高级的WPF主题,如自定义控件、多文档界面和异步编程等。 通过学习本书,读者可以全面了解WPF的基础知识和常用技术,能够使用WPF开发出功能强大、界面美观的应用程序。无论是从零开始学习WPF,还是希望系统地复习和巩固WPF知识的读者,本书都是一本不可或缺的参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值