WPF XAML(一)

一、XAML的含义

问:XAML的含义是什么?为什么WPF中会使用XAML?而不是别的?

答:在XAML是基于XML的格式,XML的优点在于设计目标是具有逻辑性易读而且简单内容也没有被压缩。  其中需要提一下XAML文件在 Visual Studio (VS) 编译时,是会被转换为BAML。BAML最终会以资源的形式嵌入到DLL或者EXE程序集中。由于BAML是标记化的,所以在程序运行时能够被更快的解析。

二、 XAML文档中的含义 

        我们新建一个WPF应用程序。(创建的过程就跳过了,如果不知道可以查一下)在我们新建的WPF程序中,如下图的红框内容是我们需要介绍的内容。

 放大的效果,我们一行一行的解释:

示例解释:

        首先我们可以关注到两个元素,Window和Grid元素被<>修饰起来的其实都是创建了一个类型的实例。例如<Grid>就是创建了一个Grid对象。其中还需要注意其中Window我们称呼其为“顶级元素”因为在XAML中必须且只能有一个顶级元素。顶级元素在WPF中只有三种类型,其他两种是 Page和Application

 Title="MainWindow" Height="450" Width="800"

 示例解释:

        我们关注到上面的,如Title="MainWindow"  其中这里就是给当前Window 元素对象属性进行了对Title属性赋值,其中赋值是通过attribute特性来实现的。attribute特性可以为每一个类的属性进行赋值。有些情况属性值比较复杂就采用属性元素语法(后面介绍)。

        运行效果是Title 设置当前窗体的标题Width Height是设置当前窗体的宽和高的

<Window x:Class="WpfApp2.MainWindow"

 示例解释:

         这里是指示XAML文件对应的C#类。换句话说就是创建了一个名为MainWindow的新类,改类继承Window

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

 示例解释:

        这个在WPF当中是指定名称空间的意思,其中以xmlns开头是因为它是xml中的一个特殊特性。它专门用来声明名称空间。所以我们在声明名称空间的时候,通常都是以xmlns开头。

        当前这个名称空间是指向WPF所有的类。

        当前的名称空间是没有前缀的所以它是整个文档的默认名称空间,我们在使用当前名称空间里面的WPF的所有类,我们就不需要以前缀开头来去声明。

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

 示例解释:改名称空间的前缀为X所以在使用当前名称空间的内容前面需要以<X:开头。

举个例子:

 <x:Array Type="List">
     <List>
         <ListItem>
             <Paragraph
                 FontFamily="1"
                 FontSize="15"
                 FontStyle="Normal"
                 FontWeight="Bold">
                 5
             </Paragraph>
         </ListItem>
     </List>
 </x:Array>

三、代码隐藏类

        在我们创建wpf的时候我们前面提到了有一行<Window x:Class="WpfApp2.MainWindow"。是Windows ,X 前缀开头的一个Class来修饰了一个MainWindow类,当前类继承自Windows 。其实这个时候我们的编译器就自动为我们生成了当前类的代码。

代码如下所示:

namespace WpfApp2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

        我们介绍一下InitializeComponent方法。当前方法就是 调用System.Windows.Application类的LoadComponent方法LoadComponent方法是从程序集中提取BAML并用它来构建用户界面,解析BAML时它会创建每个控件的对象设置其属性并关联所有事件处理程序。所以他在我们wpf当中是很重要的一个方法所以我们永远都不要删除它,就算我们新建了一个构造函数,我们也应该在新建的构造方法当中调用当前方法

四、简单属性和类型转换器

        简单属性?简单属性就是我们前面提到的直接进行对属性进行赋值如  Width="800" ,但我们这里属性赋值的过程中其实编译器会执行类型转换的操作。主要是为了关联非字符串和字符串属性。将转换后的值赋值给我们的属性。首先属性赋值的的过程中都会去查找TypeConverter特性如果提供了TypeConverter特性,该特性将指定哪个类可执行转换。

如Background 属性指定了BrushConverter类型转换器,怎么找到的呢?

 

 提示:类型转换器指定了什么类型的值可以转换为当前属性的值 。 

五、复杂属性

问:什么是复杂属性?

答:实际上就是当前属性包含了完备的对象,当前的对象具有自己的一系列属性。也可以通过类型转换器来实现,但有时可能这种实现方式更加复杂。

举个例子:

<Window.Background>
    <SolidColorBrush Color="Red" />
</Window.Background>

 注意:<Window.Background>标签 我们称呼为WIndow的子标签。

举个例子:

 <Window.Background>
     <LinearGradientBrush>
         <GradientStop Color="Red" Offset="0"  />
         <GradientStop Color="Black" Offset="1"  />
     </LinearGradientBrush>
 </Window.Background>

示例解释:

       当前我们创建了LinearGradientBrush对象然后创建了GradientStop 对象来填充GradientStopCollection集合(LinearGradientBrush 的类型)


提示:所有的xaml我们都说是创建了某某对象然后给某某对象添加了什么样的内容,那么反过来其实我们用xaml写的所有的代码我们都可以用代码来实现 。这里就不做示范了。

六、标记扩展

问:什么是标记扩展?

答:他可以帮我们完成某些情景:如可将属性值设置为一个已经存在的对象、或者希望通过将一个属性绑定到另一个控件来动态的设置属性值。这两种情况我们都需要使用标记扩展。其中我会举例第一种的写法。

举个例子:

 <Window.Background>
     <LinearGradientBrush>
         <LinearGradientBrush.GradientStops>
             <GradientStop Offset="0.5" Color="{x:Static local:MainWindow.color}" />
             <GradientStop Offset="0.5" Color="Black" />
         </LinearGradientBrush.GradientStops>
     </LinearGradientBrush>
 </Window.Background>
using System.Windows;
using System.Windows.Media;

namespace WpfApp2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        public static Color color { get; set; } = Colors.Red;

    }
}

示例解释: 当前代码将Color属性设置为一个已经存在的对象。

七、嵌套元素

XAML每个元素决定如何处理嵌套的元素。这种交互会使用下面三种机制中的一种进行中转。 

1 如果父元素实现了Ilist接口,解析器将调用list点Add的方法,并且为该方法传入子元素作为参数 

2 如果父元素实现了IDictionary接口那么将调用IDictionary。Add的方法并且为该方法传递子元素作为参数。当使用字典集合时还必须设置X:Key特性以便为每个条目指定键名。

3 父元素使用ContentProperty特性进行修饰,解析器将使用子元素设置对应的属性

举个例子:

 <Window.Background>
     <LinearGradientBrush>
         <LinearGradientBrush.GradientStops>
             <GradientStop Offset="0.5" Color="{x:Static local:MainWindow.color}" />
             <GradientStop Offset="0.5" Color="Black" />
         </LinearGradientBrush.GradientStops>
     </LinearGradientBrush>
 </Window.Background>

示例解释:

        当前属性GradientStops 是GradientStopCollection类型实现了IList接口所以编译器会调用list接口点Add的方法将元素作为参数添加 

举个例子:

 <Grid>
        <Button/>
        <Button/>
</Grid>

示例解释:

        当前Grid既没有实现IDictionary接口也没有实现Ilist接口但他实现了ContentProperty特性所以编译器会执行 。(可以反编译看到)那么实际程序就会调用Grid的Children属性的Add方法将嵌套的元素添加进去。;


提示:所以继承ContentControl控件都只能包含单一的嵌套元素。继承ItemsControl类的控件都可以包含多个条目集合。

举个例子:

<ListBox>
    <ListBoxItem />
    <ListBoxItem />
    <ListBoxItem />
    <ListBoxItem />
    <ListBoxItem />
    <StackPanel />
    <Button />
</ListBox>

<Button>
    <StackPanel />
</Button>

 ListBox继承ItemsControl,而Button继承ContentControl。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/313025.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s动态PV

当发布PVC之后可以生成PV&#xff0c;还可以再共享服务器上直接绑定和使用PV 动态PV需要两个组件&#xff1a; 存储卷插件&#xff0c;k8s本身支持的动态PV创建不包括NFS&#xff0c;需要声明和安装一个外插件 Provisioner&#xff1a;存储分配器。动态创建PV&#xff0c;然后…

基于JAVA+SSM框架开发的志愿者服务管理系统设计与实现【附源码】

&#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd; &#x1f680;&#x1f680;&#x1f6…

生活自来水厂污水处理设备需要哪些

生活自来水厂是确保我们日常用水质量安全的重要设施。在自来水的生产过程中&#xff0c;污水处理设备是不可或缺的环节。那么&#xff0c;生活自来水厂的污水处理设备都有哪些呢&#xff1f;本文将为您详细介绍。 首先&#xff0c;生活自来水厂的污水处理设备主要包括预处理设备…

编译器和解释器:V8是如何执行一段JS代码的

编译器和解释器&#xff1a;V8是如何执行一段JS代码的 背景编译器和解释器V8 执行 JavaScript 代码1. 生成抽象语法树&#xff08;AST&#xff09;和执行上下文2. 生成字节码3. 执行代码 JavaScript 的性能优化 背景 前端工具和框架迭出不穷&#xff0c;而且还不断有新的出现&…

ChatGLM基于LangChain应用开发实践(二)

一、使用notion样例数据构建知识库 这里使用LangChain开发框架支持的Faiss构建知识向量库&#xff0c;通过以下命令来安装Faiss的GPU版本&#xff1a; pip install faiss-gpu 简单起见&#xff0c;向量库会以文件的形式存储到磁盘&#xff0c;具体步骤如下&#xff1a; 引入…

项目经理周报,月报编写模板

一、项目基本情况 二、本周工作总结 三、下周工作计划 软件开发管理全文档获取&#xff1a;软件开发全套资料-CSDN博客

linux高级篇基础理论十一(GlusterFS)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

格密码:如何找最近的格点(CVP问题)

目录 一. 摘要 二. 介绍 2.1 简单的CVP问题 2.2 Gram-Schmidt向量 2.3 KZ基 三. 格密码的基本符号 四. CVP问题的发展 五. 如何解决CVP问题 5.1 随机取整算法 5.2 Babai算法随机取整 5.3 小结 六. 推荐论文 一. 摘要 本文章将解释如何利用随机取整算法&#xff08…

【微信小程序开发】深入学习小程序开发之功能扩展和优化

前言 随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级应用&#xff0c;已经逐渐成为许多企业和个人进行业务推广和服务提供的重要平台本文将详细介绍 微信小程序开发的功能扩展和优化&#xff0c;帮助开发者更好地提升小程序的用户体验和性能。 一、功能扩展 …

【qt】opencv导入pro

我的sdk0文件夹在opencv003项目下&#xff0c;使用opencv451 INCLUDEPATH $$PWD/sdk0/opencv/includeCONFIG(release, debug|release) {LIBS -L$$PWD/sdk0/opencv/lib/ -lopencv_world451opencv.files $$PWD/sdk0/opencv/bin/opencv_world451.dllopencv.path $$OUT_PWD/Re…

Shopify绑定Facebook收费吗?付款方式是什么?-站斧浏览器

Shopify绑定Facebook收费吗&#xff1f; 答案是&#xff1a;Shopify绑定Facebook并不收取额外费用。Shopify和Facebook之间的绑定是免费的&#xff0c;卖家可以充分利用这一功能来扩展他们的在线业务。通过将商店与Facebook Page相连接&#xff0c;卖家可以将产品目录同步到Fa…

【EI会议征稿通知】2024年机器学习与智能计算国际学术会议(MLIC 2024)

2024年机器学习与智能计算国际学术会议&#xff08;MLIC 2024&#xff09; 2024 International Conference on Machine learning and intelligent computing 智能计算与机器学习被广泛应用于大数据分析、人工智能、智能制造、智能交通、智能电网、智慧城市、智慧医疗、金融科…

imx6ull基于Linux 5.10.19移植OV2640驱动过程记录及问题解决

硬件使用正点原子的阿尔法开发板&#xff0c;摄像头原理图如下&#xff1a; OV2640是淘宝上买的0v2640模组&#xff0c;如下&#xff1a; 添加设备树节点如下&#xff1a; &i2c2 {clock-frequency <100000>;pinctrl-names "default";pinctrl-0 <&am…

gazebo怎样快速导入其他机器人及其配置

只要拿过来100块钱&#xff0c;我就告诉你我花了1天才偶然找到的内容哈哈&#xff0c;请留言

Thumbnail AI:让图片处理更智能

一、产品介绍 Thumbnail AI是一款基于人工智能技术的图片处理软件&#xff0c;能够快速、准确地生成各种尺寸的缩略图。这款软件非常适合用于网站建设、广告设计、电商等领域&#xff0c;能够大大提高图片处理效率。 二、应用场景 网站建设&#xff1a;在网站建设中&#xff…

在海绵城市建设中,低功耗遥测终端有哪些独特的优势?

近年来&#xff0c;随着物联网技术的迅猛发展&#xff0c;数据监测和传输已经成为各行各业不可或缺的环节。在诸多特殊环境中因供电问题、潮湿、不便进入等诸多原因&#xff0c;需要一款功耗低、数据传输稳定&#xff0c;防潮抗锈蚀的低功耗遥测终端。 为满足这一需求&#xf…

对谈美的:「速沸」心智如何成就爆款电火锅?

​ 「魔镜对谈」将不定期访谈行业大咖、品牌负责人&#xff0c;通过行业观察、用户分析、爆品拆解等内容分享富有价值的消费洞见。本期访谈魔镜邀请到美的生活电器事业部-调理电器总经理张进&#xff0c;为我们拆解美的电火锅如何洞察市场、通过「速沸」心智打造电火锅赛道爆品…

mysql清空并重置自动递增初始值

需求&#xff1a;当上新项目时&#xff0c;测试环境数据库导出来的表id字段一般都有很大的初始递增值了&#xff0c;需要重置一下 先上代码&#xff1a; -- 查看当前自动递增值 SHOW CREATE TABLE table_name; -- 重建自动递增索引&#xff08;可选&#xff09; ALTER TABLE t…

基于爬虫和Kettle的豆瓣电影的采集与预处理

一&#xff1a;爬虫 1、爬取的目标 将豆瓣电影网上的电影的基本信息&#xff0c;比如&#xff1a;电影名称、导演、电影类型、国家、上映年份、评分、评论人数爬取出来&#xff0c;并将爬取的结果放入csv文件中&#xff0c;方便存储。 2、网站结构 图1豆瓣网网站结构详…

数据聚合、自动补全、数据同步、es集群

目录 数据聚合 聚合的分类 DSL实现bucket聚合 DSL实现Metrics聚合 RestAPI实现聚合 多条件聚合 带过滤条件的聚合 自动补全 安装拼音分词器 自定义分词器 completion suggester查询 修改索引库数据结构 RestAPI实现自动补全查询 实现搜索框自动补全 数据同步 数…