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

news2025/1/22 12:01:11
  • 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….}"是等价的。

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

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

相关文章

Appium(四)

一、app页面元素定位 1、通过id定位元素: resrouce-id2、通过ClassName定位&#xff1a;classname3、通过AccessibilityId定位&#xff1a;content-desc4、通过AndroidUiAutomator定位5、通过xpath定位xpath、id、class、accessibility id、android uiautomatorUI AutomatorUI自…

Windows图形界面(GUI)-QT-C/C++ - Qt List Widget详解与应用

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 QListWidget概述 使用场景 常见样式 QListWidget属性设置 显示方式 (Display) 交互行为 (Interaction) 高级功能 (Advanced) QListWidget常见操作 内容处理 增加项目 删除项目…

Oracle 创建并使用外部表

目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…

靠右行驶数学建模分析(2014MCM美赛A题)

笔记 题目 要求分析&#xff1a; 比较规则的性能&#xff0c;分为light和heavy两种情况&#xff0c;性能指的是 a.流量与安全 b. 速度限制等分析左侧驾驶分析智能系统 论文 参考论文 两类规则分析 靠右行驶&#xff08;第一条&#xff09;2. 无限制&#xff08;去掉了第一条…

Kafka 源码分析(一) 日志段

首先我们的 kafka 的消息本身是存储在日志段中的, 对应的源码是下面这段代码: class LogSegment private[log] (val log: FileRecords,val lazyOffsetIndex: LazyIndex[OffsetIndex],val lazyTimeIndex: LazyIndex[TimeIndex],val txnIndex: TransactionIndex,val baseOffset:…

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

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

Linux - 线程池

线程池 什么是池? 池化技术的核心就是"提前准备并重复利用资源". 减少资源创建和销毁的成本. 那么线程池就是提前准备好一些线程, 当有任务来临时, 就可以直接交给这些线程运行, 当线程完成这些任务后, 并不会被销毁, 而是继续等待任务. 那么这些线程在程序运行过程…

【K8S系列】K8s 领域深度剖析:年度技术、工具与实战总结

引言 Kubernetes作为容器编排领域的行业标准&#xff0c;在过去一年里持续进化&#xff0c;深刻推动着云原生应用开发与部署模式的革新。本文我将深入总结在使用K8s特定技术领域的进展&#xff0c;分享在过去一年中相关技术工具及平台的使用体会&#xff0c;并展示基于K8s的技术…

C++《AVL树》

在之前的学习当中我们已经了解了二叉搜索树&#xff0c;并且我们知道二叉搜索树的查找效率是无法满足我们的要求&#xff0c;当二叉树为左或者右斜树查找的效率就很低下了&#xff0c;那么这本篇当中我们就要来学习对二叉搜索树进行优化的二叉树——AVL树。在此会先来了解AVL树…

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…

王道数据结构day1

2.1线性表的定义和基本操作 1.线性表的定义 相同数据类型的数据元素的有限序列 位序(从1开始&#xff09; 表头元素&#xff0c;表尾元素 直接钱去&#xff0c;直接后继 2.线性表的基本操作 基本操作&#xff1a;创销&#xff0c;增删改查 优化插入&#xff1a; 查找

电梯系统的UML文档07

从这个类中得到的类图&#xff0c;构划出了软件的大部分设计。 系统结构视图提供软件和整个系统结构最复杂的也是最优雅的描述。和通常的软件系统相比&#xff0c;在分布式嵌入系统中了解系统组件如何协同工作是非常重要的。毕竟&#xff0c;每个类图仅仅是一个系统的静态设计…

数据恢复常见故障(五)晶振异常导致时钟Clock信号异常引发的硬盘故障

晶振是给固态硬盘“主控”芯片工作提供时钟信号的器件。 高温、高湿、撞件等都会引起晶振不起振&#xff0c;最终导致时钟信号异常。 如图是正常情况下的晶振波形。 晶振异常时&#xff0c;输出的波形&#xff0c;不起振。 由于晶振异常&#xff0c;无法提供时钟信号&#…

16.5万煤气柜柜位计故障分析

一、事故经过&#xff1a; 2015年8月1&#xff14;日20点45分&#xff0c;16.5万立煤气柜柜顶油封溢流口有大量油液溢出&#xff0c;此时雷达柜位计在计算机上示值为63.79米&#xff0c;由于接近傍晚天色较暗&#xff0c;岗位操作员并未及时发现这一异常状况。22点45分左右&…

ARM学习(42)CortexM3/M4 MPU配置

笔者之前学习过CortexR5的MPU配置,现在学习一下CortexM3/M4 MPU配置 1、背景介绍 笔者在工作中遇到NXP MPU在访问异常地址时,就会出现总线挂死,所以需要MPU抓住异常,就需要配置MPU。具体背景情况可以参考ARM学习(41)NXP MCU总线挂死,CPU could not be halted以及无法连…

STM32 FreeRTOS 任务挂起和恢复---实验

实验目标 学会vTaskSuspend( )、vTaskResume( ) 任务挂起与恢复相关API函数使用&#xff1a; start_task:用来创建其他的三个任务。 task1&#xff1a;实现LED1每500ms闪烁一次。 task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键按下逻辑&#xff0c;KE…

七.网络模型

最小(支撑)树问题 最小部分树求解&#xff1a; 破圈法&#xff1a;任取一圈&#xff0c;去掉圈中最长边&#xff0c;直到无圈&#xff1b; 加边法&#xff1a;取图G的n个孤立点&#xff5b;v1&#xff0c;v2&#xff0c;…&#xff0c; vn }作为一个支撑图&#xff0c;从最短…

web前端1--基础

&#xff08;时隔数月我又来写笔记啦~&#xff09; 1、下载vscode 1、官网下载&#xff1a;Visual Studio Code - Code Editing. Redefined 2、步骤&#xff1a; 1、点击同意 一直下一步 勾一个创建桌面快捷方式 在一直下一步 2、在桌面新建文件夹 拖到vscode图标上 打开v…

麦田物语学习笔记:保存和加载场景中的物品

目录 基本流程 1.代码思路 2.代码实现 最终效果 补充知识点 1.序列化 2.委托 基本流程 现在在切换场景后,场景中的物品即使被拾取了,也还是会被重新加载出来,所以本篇文章的任务是在切换场景前后能保留当前场景的数据 1.代码思路 (1)为了保留处在地上的物品数据,就需要…

51c~SLAM~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM&#xff1a;A General SLAM Framework and Benchmark 开源代码&#xff1a;https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…