Advertisement

WPF 之 XAML语法,对象属性赋值(简单赋值、TypeConverter 标签属性与对象属性映射、标记扩展),引用外部库

阅读量:

一、XAML树形结构

框架都是树形 的,对象为根节点,一层一层向下包含。这种树形结构对于WPF整个体系都具有非常重要的意义,它不但影响着UI的布局设计,还深刻的影响着WPF的属性(Property)子系统和事件(Event)子系统等方方面面。在实际的编程过程中,我们经常要在这棵树上进行按名称查找元素,获取父/子节点等操作,为了方便操作这棵树,WPF基本类库为程序员准备了VisualTreeHelperLogicTreeHelper 两个助手类(Helper Class),同时还在一些重要的基类里封装了一些专门用于操作这棵树的方法。

复制代码
 <Window  x:Class="WpfApplication1.MainWindow"

    
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
     Title="MainWindow" Height="350" Width="532" Loaded="Window_Loaded">
    
  
    
     <Grid>
    
     <Grid.ColumnDefinitions>
    
         <ColumnDefinition Width="250*" />
    
         <ColumnDefinition Width="266*" />
    
     </Grid.ColumnDefinitions>
    
     <Grid.RowDefinitions>
    
         <RowDefinition Height="42" />
    
         <RowDefinition Height="48" />
    
         <RowDefinition Height="66" />
    
         <RowDefinition Height="153" />
    
     </Grid.RowDefinitions>
    
     <TextBox  HorizontalAlignment="Center" Margin="10,10,0,0" Name="textBox1" VerticalAlignment="Top" Grid.ColumnSpan="2"/>
    
     <TextBox  HorizontalAlignment="Center" Margin="10,10,0,0" Name="textBox2" VerticalAlignment="Top"  Grid.Row="1" Grid.ColumnSpan="2"/>
    
     <TextBox HorizontalAlignment="Right" Margin="10,10,0,0" Name="textBox3" VerticalAlignment="Top"  Grid.Row="2" Grid.Column="0"/>
    
     <TextBox  HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox4" VerticalAlignment="Top"  Grid.Row="2" Grid.Column="1"/>
    
     <Button   HorizontalAlignment="Center" Margin="10,10,0,0" Name="button1" VerticalAlignment="Top" Grid.Row="3" Grid.ColumnSpan="2">
    
     </Button>
    
     </Grid>
    
 </Window>
    
    
    
    
    html
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/Gh8oP5pfgX0AKvBHViday637MjEz.png)

二、XAML中为对象属性赋值的方法

XAML是一种声明性语言,XAML会为每一个标签创建一个与之对于的对象,对象创建之后要对它的属性进行必要的初始化之后才有使用意义。因为XAML语言不能够编写程序的逻辑,所以一份XAML文档除了使用标签声明对象就是初始化对象属性了。

复制代码
    注意:
    
    XAML中对对象赋值总共有两种方法:
    
    1、:使用字符串进行简单赋值。
    
    2、:使用属性元素(Property Element)进行复杂赋值 (使用TypeConverter类将XAML标签的Attribute与对象的Property进行映射)。
    
    plain

使用TypeConverter类将XAML标签的Attribute与对象的Property进行映射(TypeConverter 和 TypeConvertAttribute 这两个类)

(1)创建类Human,类型转换器TypeConvertAttribute

复制代码
 using System;

    
 using System.Collections.Generic;
    
 using System.Linq;
    
 using System.Text;
    
 using System.ComponentModel;
    
  
    
 namespace WpfApplication1
    
 {
    
     //类型转换器TypeConvertAttribute
    
     [TypeConverter(typeof(StringToHumanTypeConverter))]  
    
      public class Human  
    
      {  
    
      public string Name{get;set;}  
    
      public Human Child { get; set; }  
    
      } 
    
 }
    
    
    
    
    csharp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/ISpWkbCLa5T9ME03jur8UBoQHmNq.png)

(2)、从TypeConvert派生出自己的类,并重写它的ConverFrom方法

复制代码
 using System;

    
 using System.Collections.Generic;
    
 using System.Linq;
    
 using System.Text;
    
 using System.ComponentModel;
    
  
    
 namespace WpfApplication1
    
 {
    
     //首先,我们要从TypeConvert派生出自己的类,并重写它的ConverFrom方法。
    
     //这个方法有一个参数名叫做Value,这个值就是XAML文档里面为其设置的值。我们要做的就是将这个值翻译成合适对象的值并赋值给对象的属性:
    
     public class StringToHumanTypeConverter : TypeConverter
    
     {
    
     public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    
     {
    
         if (value is string)
    
         {
    
             Human human = new Human();
    
             human.Name = value as string;
    
             return human;
    
         }
    
         return base.ConvertFrom(context, culture, value);
    
     }
    
     }
    
     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    
     {
    
         return true;
    
     }
    
  
    
 }
    
    
    
    
    csharp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/g5FxR9QClOwYjhGPpuW14S8BJoiD.png)

(3)XAML引用命名空间,调用类

引用命名空间:WpfApplication1

xmlns:local="clr-namespace:WpfApplication1"

Window.Resources 定义一个Window级的Resources ,这只是一种以Window级的资源的定义.

其实Resources的定义可以在每一个容器控件中,(或者是在每一个控件,在Template 中可以用到),像C#中变量的定义一样,Resource的定义的地方不同
也就决定它的作用范围,如:

Window.Resources它的作用范围就是在Window容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源

Grid.Resources它的作用范围就是在Grid容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源

以此类推....

请注意:Window不是最上层的"容器",最上层的应该是Appication ,所以Application.Resources 的作用范围更大(有人把Application.Resource叫作全局资源,所有在这个Application下的容器控件等都可以使用,常用来做一个应该程序的Skin ,其ResourceDictionary定义的资源也类似 )

(<<我眼里的XAML结构框架>>概括为:"一个Application下有多个Window ,一个Window下有一个Grid,一个Grid下有很多布局容器,这些容器里面有好子容器或控件 ,控件里面有Template,template里面又可以里Grid…… ")

(4)按钮事件

复制代码
     private void button1_Click(object sender, RoutedEventArgs e)

    
     {
    
         Human human = (Human)this.FindResource("human123");
    
         MessageBox.Show(human.Child.Name);
    
     }
    
    
    
    
    csharp
    
    

哈希表/字典:管理资源

(1)、添加Style文件夹,在文件夹中添加 “资源字典”文件ShinyRed.xaml

复制代码
 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
                 xmlns:sys="clr-namespace:System;assembly=mscorlib"
    
                 xmlns:local="clr-namespace:WpfApplication10"
    
                 >
    
  
    
     <local:Human x:Key="human123" Child="ABC"/>
    
  
    
     <sys:String x:Key="str">
    
     www
    
     </sys:String>
    
     <sys:Double x:Key="doub">
    
     1.222
    
     </sys:Double>
    
  
    
     <TextBlock x:Key="Res1" Text="111"/>
    
     <TextBlock x:Key="Res2" Text="222"/>
    
  
    
     <XmlDataProvider x:Key="xdp" XPath="FileSystem/Folder">
    
     <x:XData>
    
         <FileSystem xmlns="">
    
             <Folder Name="1">
    
                 <Folder Name="2" Value="Pages/Page_SqlAddress.xaml"/>
    
                 <Folder Name="3" Value="Pages/Page_ConfigControls.xaml"/>
    
             </Folder>
    
         </FileSystem>
    
     </x:XData>
    
     </XmlDataProvider>
    
     
    
 </ResourceDictionary>
    
    
    
    
    cs
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/WPund2jX0OxprCcGVfMJL3sYai1F.png)

(2)、App.xaml文件

复制代码
 <Application x:Class="WpfApplication10.App"

    
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
          StartupUri="MainWindow.xaml">
    
     <Application.Resources>
    
     <ResourceDictionary>
    
         <ResourceDictionary.MergedDictionaries>
    
             <ResourceDictionary Source="/Style/ShinyRed.xaml"/>
    
         </ResourceDictionary.MergedDictionaries>
    
     </ResourceDictionary>
    
     </Application.Resources>
    
 </Application>
    
    
    
    
    cs
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/R72FQCmq8ugrkLUtM1PVYBdOWcK3.png)

标记扩展:有一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做解析、生成相应的对象。

三、其他XAML语法

(1)引用外部库

clr-namespace:命名空间名称;assembly=外部*.dll

(2) 访问修饰符

<Window x:Class="WpfApplication1.MainWindow" x:ClassModifier="internal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">

<Button Height="100" Width="100" x:FieldModifier="public" />

(3)属性元素

为属性赋予复杂对象。

(4) 附加属性

在WPF布局管理器类(Grid、DockPanel等)中 定位 UI元素

<Canvas >
<Button Canvas.Top="40"/>

(5)标记扩展

XAML 解析器从专门的 外部类 中获取属性的值。这是非常有好处的,因为有些属性需要一些代码语句来计算其值。

前言:XAML有时需要一些标准功能或者默认行为无法满足的功能,比如属性赋值,它可能并不是直接赋一个字符串,而是要对已定义的对象的一个引用,由此便诞生了标记扩展。

标记扩展的语法是使用“{}”,例如 Map={bindingelementname=”myMap“}

标记扩展可分为以下几类:

a、基于WPF的标记扩展

StaticResource:通过引用已定义资源的值来为XAML属性提供值。

DynamicResource:通过将资源的引用推迟到时来为XAML属性提供值。动态资源引用强制来每次访问此类资源时都进行重新访问。

推荐阅读:

<>

<>

Binding:按引用于元素的数据上下文来为属性提供数据绑定值。

RelativeSource:在时,为了可以在元素树中定位若干可能关系的Binding提供源信息。

TemplateBinding:提供数据模板绑定。

b、XAML定义的标记扩展

x:Type:为所提供的类型提供Type对象。

x:Static:为属性值提供已定义的静态值。该静态值必须在引用之前定义。

x:Null:将null指定为XAML属性的值。

x:Array:为XAML中常规数组的创建提供支持

全部评论 (0)

还没有任何评论哟~