Attribute 与 Property 之间的区别

  • Property 对应着抽象对象身上的性状;
  • Attribute 是针对标签的特征;
  • 往往一个标签具有的 Attribute 对于它所代表的对象的 Property。

1. 为对象属性赋值

1.1 使用标签的 Attribute 为对象属性赋值;

<Rectangle x:Name="rectangle" Width="200" Height="200" Fill="Blue"/>

其中对 Fill 的赋值等价于后台代码:

SolidColorBrush sBrush = new SolidColorBrush();
sBrush.Color = Colors.Blue;
this.rectangle.Fill = sBrush;

1.2 使用 TypeConverter 将 XAML 上的 Attribute 与对象的 Property 进行映射

public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
} <Window.Resources>
<local:Human x:Key="human" Name="maomao" Child="ABC" />
</Window.Resources>
<Grid>
<Button Content="click me" Click="Button_Click"/>
</Grid> private void Button_Click(object sender, RoutedEventArgs e)
{
Human hu = (Human)this.FindResource("human");
MessageBox.Show(hu.Child.Name);
}

会抛出 ArgumentException 异常:System.String 的对象无法转换成类;

解决方式:

[TypeConverter(typeof(StringToHumanTypeConverter))]
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
} public class StringToHumanTypeConverter : System.ComponentModel.TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
Human h = new Human();
h.Name = value as string;
return h;
}
return base.ConvertFrom(context, culture, value);
}
}

1.3 属性元素

<Rectangle>
<Rectangle.Fill>
<SolidColorBrush Color="Blue" />
</Rectangle.Fill>
</Rectangle>

在需要的时候运用,切勿过犹不及。一般属性的值是复杂对象时用。

<Rectangle>
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStop Color="AliceBlue" Offset="0.2"/>
<GradientStop Color="Blue" Offset="0.7"/>
<GradientStop Color="DarkBlue" Offset="1.0"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>

1.4 标记拓展

<TextBox Text="{Binding ElementName=slider1, Path=Value, Mode=OneWay}"/>

还可以嵌套

<TextBox Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>
  • 一些缩写方法:(具体的原因这个后面再讲)
  • {Binding ElementName=slider1, Path=Value} = {Binding Value, ElementName=slider1}
  • {StaticResource xx,...} = {StaticResource ResourceKey=xx,...}
  • Text="{x:Static ...}" = Text="{x:StaticExtension ...}"
<Window.Resources>
<local:Human x:Key="human" Name="maomao" Child="ABC" />
</Window.Resources>
<TextBox Text="{Binding Source={StaticResource ResourceKey=human}, Path=Name}"/>
<TextBox Text="{x:Static local:Hei.man}"/> public class Hei
{
public static string man = "What is up";
}

2. 代码后置

xx.xaml.cs 只是为了方便管理文件,非必须,xaml 解析器会找 x:Class 对应的类;

可以使用 <x:Code> 把代码后置的 C# 代码搬到 xaml 中。

<Button  Grid.Row="3" Content="click me" Click="Button_Click"/>
<x:Code>
<![CDATA[
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("I am from X:Code");
}
]]>
</x:Code>

3. 导入程序集并引用其中的命名中间

  1. 编写库类项目并编译得到 .dll 文件或者获得别人的 .dll 文件;
  2. 将类库项目或者 .dll 引用进自己的项目;
  3. 在 C# 和 xaml 中引用类库中的名称空间。
<Window x:Class="WpfApp1.CommandMode.CommandModeWindow"
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:WpfApp1.CommandMode"
xmlns:Control="clr-namespace:Controls;assembly=MyLibrary"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Window.Resources>
<sys:String x:Key="stringA">This is a </sys:String>
</Window.Resources>
...
</Window>
  • xmlns 是 XMAL 中用于声明命名空间的 Attribute。
  • xmlns:映射名="clr-namespace:库类中的命名空间名称;assembly=库类文件名"
  • 引用语法:<映射名:类名>,又如:<Controls:MessagePanel x:Name="window1">

WPF 基础 - xaml 语法总结的更多相关文章

  1. 4 WPF学习---系统的学习XAML语法

    转载:http://blog.csdn.net/fwj380891124/article/details/8093001 1,XAML文档的树形结构: UI在用户眼里面是个平面结构.如下图所示,在用户 ...

  2. XAML属性赋值转换之谜(WPF XAML语法解密)

    XAML与XML类似,就是XML延伸过来的.为了更好的表达一些功能,WPF对XML做了扩展,有些功能是WPF在后台悄悄的替你做了.有时候,虽然实现了某个功能,但是对实现原理还是很茫然.今天就讲讲XAM ...

  3. WPF中 PropertyPath XAML 语法

    原文:WPF中 PropertyPath XAML 语法 PropertyPath 对象支持复杂的内联XAML语法用来设置各种各样的属性,这些属性把PropertyPath类型作为它们的值.这篇文章讨 ...

  4. WPF笔记(1.1 WPF基础)——Hello,WPF!

    原文:WPF笔记(1.1 WPF基础)--Hello,WPF! Example 1-1. Minimal C# WPF application// MyApp.csusing System;using ...

  5. .Net Core WPF之XAML概述

    原文链接,机器翻译,有误处参看原文. XAML overview in WPF 2019/08/08 What is XAML XAML syntax in brief Case and white ...

  6. WPF基础到企业应用系列6——布局全接触

    本文转自:http://knightswarrior.blog.51cto.com/1792698/365351 一. 摘要 首先很高兴这个系列能得到大家的关注和支持,这段时间一直在研究Windows ...

  7. 基本 XAML 语法指南

    我们介绍了 XAML 语法规则,以及用于描述 XAML 语法中存在的限制或选项的术语.当出现以下情况时你会发现本主题很有用:不熟悉 XAML 语言的使用,希望加强对术语或某些语法部分的理解,或者对 X ...

  8. WPF:XAML概述

    简介 XAML是eXtensible Application Markup Language可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言.XAML提供了一种便于 ...

  9. wpf中xaml的类型转换器与标记扩展

    原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需 ...

随机推荐

  1. 交换机上禁止某个MAC地址通信

    当分析出网络中某台机器中毒时而有不知道它的具体位置,我们可以通过获取其MAC地址然后在交换机上禁止其MAC来达到隔离它的效果.通过ARP表查询IP地址对应的MAC地址,再将该MAC地址加入黑名单过滤. ...

  2. 可重入锁ReentrantLock解析

    说到可重入锁,先从AQS的ConditionObject说起,AQS的内部类ConditionObject是构建显示锁条件队列的基础.之前AQS的解析没有说这个内部类,这里和ReentrantLock ...

  3. tensorflow-gpu+"Failed to create session"

    成因: 未给系统指定相应使用的GPU 解决: 层面1: 针对单个程序: CUDA_VISIBLE_DEVICES=0 python main.py import os; os.environ['CUD ...

  4. Code Book All In One

    Code Book All In One Jupyter Notebook Jupyter Lab https://jupyter.org/ Storybook https://storybook.j ...

  5. Android Studio 4.x

    Android Studio 4.x https://developer.android.com/studio https://d.android.com/r/studio-ui/whats-new- ...

  6. UI 素材网站

    UI 素材网站 UI 设计师网站 国外: dribble.behance.Pinteres 国内: 优设.站酷.UI中国.花瓣 https://design.google/ https://dribb ...

  7. 如何正确的阅读 js 源码

    如何正确的阅读 js 源码 https://astexplorer.net/ AST Abstract Syntax Trees https://alligator.io/js/traversing- ...

  8. modal 遮罩层,滚动穿透 bug

    modal 遮罩层,滚动 穿透bug float 弹层 taro 小程序弹框 滚动击穿 问题 https://segmentfault.com/q/1010000011134345 solution ...

  9. better-scroll使用参考

    ************better-scroll是基于父元素固定高度,溢出才滚动的,所以父元素务必定高,否则无法滚动***************************************** ...

  10. 画一个PBN大角度飞越转弯保护区

      今天出太阳了,尽管街上的行人依旧很少,但心情开始不那么沉闷了.朋友圈里除了关注疫情的最新变化之外,很多人已经开始选择读书或是和家人一起渡过这个最漫长的春节假期.陕西广电网络春节期间所有点播节目一律 ...