WPF2-在xaml为对象的属性赋值

news2025/1/28 1:16:08
  • 1. Attribute=Value方式
    • 1.1. 简单属性赋值
    • 1.2. 对象属性赋值
  • 2. 属性标签的方式给属性赋值
  • 3. 标签扩展 (Markup Extensions)
    • 3.1. StaticResource
    • 3.2. Binding
      • 3.2.1. 普通 Binding
      • 3.2.2. ElementName Binding
      • 3.2.3. RelativeSource Binding
      • 3.2.4. StaticResource Binding (带参数的 Binding)
      • 3.2.5. TemplateBinding
    • 3.3. 标签扩展总结:
    • 3.4. 标签扩展注意:

1. Attribute=Value方式

1.1. 简单属性赋值


<Grid>

    <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
</Grid>



上面的代码中Content HorizontalAlignment VerticalAlignment Width Click都是直接复制的方式,但可以看到这种复制最简单,但不能赋太复杂的值。

优点: 赋值方便。

缺点: Value为字符串,但是对象属性未必是字符串,因此无法赋太复杂的值。

1.2. 对象属性赋值

先在cs代码中定义对象Human


public class Human

{

    public string Name { get; set; }
    public Human Child { get; set; }
}



然后我们xaml上有个Human对象,并给human对象的Child属性赋值

xaml代码:


<Window x:Class="MyWPFDemo1.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:MyWPFDemo1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>


    <Window.Resources>
        <local:Human x:Key="Human1" Name="小明"/>
    </Window.Resources>
</Window>



cs代码:


namespace MyWPFDemo1

{

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


        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Human h = (Human)this.FindResource("Human1");
            MessageBox.Show(h.Name);            
            //MessageBox.Show(h.Name + "的孩子是" + h.Child.Name);            //xaml中没有给child对象赋值,所以直接访问会报错
        }
    }


    public class Human
    {
        public string Name { get; set; }
        public Human Child { get; set; }
    }
}

在上面的示例中human类中的属性child没有被赋值,如果赋值为字符串会编译出错,那么只有通过实现typeConverter来进行扩展。

首先,我们要从TypeConverter类派生出自己的类,并重写它的一个ConvertFrom方法。这个方法有一个参数名为value,这个值就是在XAML文档里为它设置的值我们要做的就是把这个值“翻译”成合适类型的值赋给对象的属性:


 [TypeConverterAttribute(typeof(StringToHumanConvertor))]
 public class Human
 {
     public string Name { get; set; }
     public Human Child { get; set; }
 }


 
 public class StringToHumanConvertor : TypeConverter
 {
     public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
     {
         string name = value.ToString();
         Human child = new Human();
         child.Name = name;
         return child;
     }
 }


这样就可以在xaml中直接对Child属性赋值了,


<Window.Resources>

    <local:Human x:Key="Human1" Name="小明" Child="小小明"/>
</Window.Resources>

2. 属性标签的方式给属性赋值

在XAML中,非空标签均具有自己的内容(Content)。标签的内容指的就是夹在起始标签和结束标签之间的一些子级标签,每个子级标签都是父级标签内容的一个元素(Element),简称为父级标签的一个元素。顾名思义,属性元素指的是某个标签的一个元素对应这个标签的一个属性,即以元素的形式来表达一个实例的属性。代码描述为:


<ClassName>

    <ClassName.PropertyName>
        <!--以对象形式为对象的属性赋值-->
    </ClassName.PropertyName>
</ClassName>

遇到属性是复杂对象时这种语法的优势就体现出来了,如使用线性渐变画刷来填充这个矩形。遇到属性是复杂对象时这种语法的优势就体现出来了,如使用线性渐变画刷来填充这个矩形。


<Grid VerticalAlignment="Center" HorizontalAlignment="Center">

    <Rectangle x:Name="rectangle" Width="200" Height="120">
        <Rectangle.Fill>
            <LinearGradientBrush>
                <LinearGradientBrush.StartPoint>
                    <Point   X="0" Y="0"/>
                </LinearGradientBrush.StartPoint>
                <LinearGradientBrush.EndPoint>
                    <Point   X="1" Y="1"/>
                </LinearGradientBrush.EndPoint>
                <LinearGradientBrush.GradientStops>
                    <GradientStopCollection>
                        <GradientStop       Offset="0.2" Color="LightBlue"/>
                        <GradientStop       Offset="0.7" Color="Blue"/>
                        <GradientStop       Offset="1.0" Color="DarkBlue"/>
                    </GradientStopCollection>
                </LinearGradientBrush.GradientStops>
            </LinearGradientBrush>
        </Rectangle.Fill>
    </Rectangle>
</Grid>

文章配图

3. 标签扩展 (Markup Extensions)

仔细观察XAML中为对象属性赋值的语法,你会发现大多数赋值都是为属性生成一个新对象。但有时候需要把同一个对象赋值给两个对象的属性,还有的时候需要给对象的属性赋一个null值,WPF甚至允许将一个对象的属性值依赖在其他对象的某个属性上。当需要为对象的属性进行这些特殊类型赋值时就需要使用标记扩展了。

  • 所谓标记扩展,实际上是一种特殊的Attribute=Value语法,其特殊的地方在于Value字符串是由一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做出解析、生成相应的对象。

在 WPF 中,标签扩展 (MarkupExtension) 主要用于提供数据绑定、资源引用等动态功能。对于资源引用和数据绑定,常用的标签扩展有两种主要类型:StaticResourceBinding。而对于这些标签扩展,我们通常会有不同的方式来绑定数据或引用资源。

3.1. StaticResource

StaticResource 是一种标签扩展,用于从资源字典中引用资源。在 XAML 中,StaticResource 通过键名查找静态资源。这是一种在应用启动时就加载并且在整个应用程序生命周期内不会改变的资源引用方式。


<Button Content="{StaticResource MyButtonStyle}" />

3.2. Binding

Binding 标签扩展用于数据绑定,允许将 UI 元素的属性绑定到数据源。数据源可以是任何实现了 INotifyPropertyChanged 接口的对象或其他可绑定的对象。Binding 是数据绑定机制的核心。

Binding 也有多种方式和特性,以下是 5 种常见的绑定方式:

3.2.1. 普通 Binding

最常见的 Binding 方式,通过指定一个数据源和路径来绑定。


<TextBlock Text="{Binding Path=Name}" />

3.2.2. ElementName Binding

将数据绑定到页面中的另一个元素,通过 ElementName 指定源元素。


<TextBlock Text="{Binding Path=Text, ElementName=myTextBox}" />

<TextBox Name="myTextBox" Text="Hello World" />

3.2.3. RelativeSource Binding

使用 RelativeSource 绑定来指定相对于当前元素的上下文,例如父元素或祖先元素。


<TextBlock Text="{Binding Path=Name, RelativeSource={RelativeSource AncestorType=Window}}" />

3.2.4. StaticResource Binding (带参数的 Binding)

通过 Binding 与静态资源配合使用,比如从资源字典中绑定样式或其他资源。


<TextBlock Text="{Binding Source={StaticResource MyResourceKey}}" />

3.2.5. TemplateBinding

TemplateBinding 是一种简化的绑定方式,通常用于控制模板中的元素。它通常用于控件模板中的数据绑定,简化了 Binding 的写法。


<Button Content="{TemplateBinding Button.Content}" />

3.3. 标签扩展总结:

在 WPF 中,常见的 BindingStaticResource 标签扩展包括以下五种主要方式:

StaticResource 用于引用静态资源。
普通 Binding,直接绑定数据源和属性。
ElementName 绑定,绑定到同一页面中的另一个元素。
RelativeSource 绑定,基于元素的相对位置进行绑定。
TemplateBinding,简化控件模板中的绑定。

3.4. 标签扩展注意:

● 标记扩展是可以嵌套的,例如Text="{Binding Source=(StaticResource myDataSource),Path=PersonName)"是正确的语法。

● 标记扩展具有一些简写语法,例如"{Binding Value,….!“与”[Binding Path=Value,…]“是等价的、”(StaticResource myString,….}“与”(StaticResource ResourceKey-myString,….)" 是等价的。两种写法中,前者称为固定位置参数 (Positional Parameter),后者称为具名参数(Named Parameters)。固定位置参数实际上就是标记扩展类构造器的参 数,其位置由构造器参数列表决定。

● 标记扩展类的类名均以单词Extension为后级,在XAML使用它们的时候 Extension 后级可以省略不写,比如写Text-“{x:Static.….}” 与写Text="{x:StaticExtension….}"是等价的。

XAML系列文章:
WPF1-从最简单的xaml开始

WPF2-在xaml为对象的属性赋值

WPF3-在xaml中引用其他程序集的名称空间

WPF4-代码后置

WPF5-x名称空间

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uart iic spi三种总线的用法

1、uart串口通信 这种连接方式抗干扰能力弱&#xff0c;旁边有干扰源就会对收发的电平数据造成干扰&#xff0c;进而导致数据失真 这种连接方式一般适用于一块板子上面的两个芯片之间进行数据传输 &#xff0c;属于异步全双工模式。 1.空闲位&#xff1a;当不进行数据收发时&am…

Java 高级工程师面试高频题:JVM+Redis+ 并发 + 算法 + 框架

前言 在过 2 个月即将进入 3 月了&#xff0c;然而面对今年的大环境而言&#xff0c;跳槽成功的难度比往年高了很多&#xff0c;很明显的感受就是&#xff1a;对于今年的 java 开发朋友跳槽面试&#xff0c;无论一面还是二面&#xff0c;都开始考验一个 Java 程序员的技术功底…

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…

【番外篇】排列组合实现算法2(Java版)

一、说明 在牛客网的很多算法试题中&#xff0c;很多试题底层都是基于排列组合算法实现的&#xff0c;比如动态规划、最优解、最大值等常见问题。排列组合算法有一定的难度&#xff0c;并不能用一般的多重嵌套循环解决&#xff0c;没有提前做针对性的学习和研究&#xff0c;考…

PAT甲级-1020 Tree Traversals

题目 题目大意 给出一棵树的后序遍历和中序遍历&#xff0c;要求输出该树的层序遍历。 思路 非常典型的树的构建与遍历问题。后序遍历和中序遍历可以得出一个树的结构&#xff0c;用递归锁定根节点&#xff0c;然后再遍历左右子树&#xff0c;我之前发过类似题目的博客&…

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…

【AppleID】注册M区AppleID 2025年

注册&#xff08;一台电脑一天只能注册一个&#xff09; https://account.apple.com/ 需任意邮箱&#xff0c;任意手机 手机上登录后填地址 示例

frida的常用api

1、Hook普通方法、打印参数和修改返回值 Hook函数 Hook代码 function hookTest1(){var utils Java.use("com.zj.wuaipojie.Demo");utils.a.implementation function(str){// a "test";var retval this.a(str);console.log(str , retval);return retva…

基于C语言的数组从入门到精通

简介:本篇文章主要介绍了一维数组,二维数组,字符数组的定义,数组的应用,数组的核心代码解析,适用于0基础的初学者. C语言数组 1.一维数组 1.1定义 1.1.1声明 语法:数据类型 数组名[数组大小];示例:int arr[5]; 1.1.2初始化 a.静态初始化 完全初始化&#xff1a;int arr[5] {1…

【Elasticsearch】inference ingest pipeline

Elasticsearch 的 Ingest Pipeline 功能允许你在数据索引之前对其进行预处理。通过使用 Ingest Pipeline&#xff0c;你可以执行各种数据转换和富化操作&#xff0c;包括使用机器学习模型进行推理&#xff08;inference&#xff09;。这在处理词嵌入、情感分析、图像识别等场景…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组&#xff0c; 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn&#xff0c; 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…

算法每日双题精讲 —— 二分查找(山脉数组的峰顶索引,寻找峰值)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#x1f4aa; 在算法的…

mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用

全国地图json数据下载地址 目录 html加载全部代码 方式一&#xff1a;使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式&#xff0c;设置type加载数据类型 设置线条 鼠标移入改变颜色&#xff0c;设置图层属性&#xff0c;此处是fill-extru…

衡量算法性能的量级标准:算法复杂度

今天开始数据结构的学习&#xff01;作为一大重点&#xff0c;拿出态度很重要&#xff0c;想要真实掌握&#xff0c;博客笔记自然少不了&#xff01;重点全部上色&#xff01;避免疏忽 下面我们从0基础开始学习今天的第一节&#xff01;不用担心看不懂&#xff0c;拒绝枯燥的理…

IDE提示:因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170

问题情况 不知道为什么我的IDE终端运行命令的时候总提示以下内容&#xff1a; Import-Module : 无法加载文件 D:\Anaconda3\shell\condabin\Conda.psm1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID1351…

DRF开发避坑指南01

在当今快速发展的Web开发领域&#xff0c;Django REST Framework&#xff08;DRF&#xff09;以其强大的功能和灵活性成为了众多开发者的首选。然而&#xff0c;错误的使用方法不仅会导致项目进度延误&#xff0c;还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…

GD32的GD库开发

所有的Cortex-M处理器都有相同的SysTick定时器&#xff0c;因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。 这个定时器可以用作延时函数&#xff0c;不管是STM32的芯片还是GD32&#xff0c;AT32的芯片&#xff0c;delay函数都可以这么写&#xff0c;只要它是cortex-M…

LabVIEW项目中的工控机与普通电脑选择

工控机&#xff08;Industrial PC&#xff09;与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异&#xff0c;并为LabVIEW项目中的选择提供指导。 ​ 硬件设…

python如何导出数据到excel文件

python导出数据到excel文件的方法&#xff1a; 1、调用Workbook()对象中的add_sheet()方法 wb xlwt.Workbook() ws wb.add_sheet(A Test Sheet) 2、通过add_sheet()方法中的write()函数将数据写入到excel中&#xff0c;然后使用save()函数保存excel文件 ws.write(0, 0, 1234…