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

  • 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名称空间

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

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

相关文章

软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(5)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之面向服务架构设计理论与实践&#xff08;4&#xff09; 所属章节&#xff1a; 第15章. 面向服务架构设计理论与实践 第2节 SOA的发展历史 15.2 SOA的发展历史 15.2.3 SOA的微服务化发展 随着互联网技术的快速发展&a…

ICLR顶会论文学习|DRL-based改进启发式求解方法JSSP

论文名&#xff1a;Deep Reinforcement Learning Guided Improvement Heuristic for Job Shop Scheduling Authors: Cong Zhang, Zhiguang Cao, Wen Song, Yaoxin Wu, Jie Zh… 论文发表致&#xff1a;ICLR 2024 论文链接&#xff1a;https://doi.org/10.48550/arXiv.2211.1…

OpenCV简介、OpenCV安装

OpenCV简介、OpenCV安装 本文目录&#xff1a; 零、时光宝盒 一、OpenCV简介 二、OpenCV图像处理基础知识 三、OpenCV-Python环境安装 2.1、纯python环境下安装OpenCV 2.2、Anaconda管理环境下安装 OpenCV 四、如何用OpenCV 中进行读取展示图像 五、OpenCV读取图像、显…

利用预训练检查点进行序列生成任务

摘要 大型神经模型的无监督预训练最近彻底改变了自然语言处理。通过从公开发布的检查点进行热启动&#xff0c;自然语言处理从业者在多个基准测试中推动了最先进的技术&#xff0c;同时节省了大量的计算时间。到目前为止&#xff0c;重点主要集中在自然语言理解任务上。在本文…

5、原来可以这样理解C语言_数组(5)sizeof 计算数组元素个数

目录 5. sizeof 计算数组元素个数 5. sizeof 计算数组元素个数 在遍历数组的时候&#xff0c;我们经常想知道数组的元素个数&#xff0c;那C语⾔中有办法使⽤程序计算数组元素个数 吗&#xff1f; 答案是有的&#xff0c;可以使⽤sizeof。 sizeof 中C语⾔是⼀个关键字&#xff…

vue中echarts-中国地图,世界地图显示(echarts5.6版本本地导入)

地图去掉南海诸岛右下角的框显示&#xff08;因为显示的不是现在的10段线&#xff09; 资源里面主要是有个改好的中国地图json其他的无所谓&#xff0c;用现有的json也行&#xff0c;主要是为了解决10段线的问题 引入需要注意 import * as echarts from “./echarts”; 目录…

Ubuntu系统更改IP,保姆级教程

原理概述 本篇文章所用工具&#xff1a; Xshell&#xff1a;点击下载 VMware Workstation Pro&#xff1a;点击下载 密钥需要自行搜索所下载的VMware对应版本密钥。 IP 地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是分配给每个连接到计算机网络的设备的…

IO进程----进程

进程 什么是进程 进程和程序的区别 概念&#xff1a; 程序&#xff1a;编译好的可执行文件 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 程序是静态的&#xff0c;没有任何执行的概念 进程&#xff1a;一个独立的可调度的任务 执行一个程序分配资…

使用插件SlideVerify实现滑块验证

作者gitee地址&#xff1a;https://gitee.com/monoplasty/vue-monoplasty-slide-verify 使用步骤&#xff1a; 1、安装插件 npm install --save vue-monoplasty-slide-verify 2、在main.js中进行配置 import SlideVerify from vue-monoplasty-slide-verify; Vue.use(SlideV…

初探——【Linux】程序的翻译与动静态链接

我们所写的C/C程序计算机是看不懂的&#xff0c;它只认识0101这样的机器码。所以我们就需要借助编译器对这些源代码进行翻译&#xff0c;使之成为计算机能够执行的二进制指令。这个过程通常分为几个关键步骤&#xff1a;预处理、编译、汇编和链接。 一.预处理&#xff08;Prep…

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

matlab实现数据极坐标显示

%% % 读取文件数据 filename E:\ProjectWorkspace\866\866data\665hangji.txt;%代码 距离 方位相对正北 时间 地址 横滚角度 TRK importdata(filename); filename1 E:\ProjectWorkspace\866\866data\665dianji.txt;%代码 距离 方位相对正北 时间 地址 横滚角度 PLOT …

Jenkins 启动

废话 这一阵子感觉空虚&#xff0c;心里空捞捞的&#xff0c;总想找点事情做&#xff0c;即使这是一件微小的事情&#xff0c;空余时间除了骑车、打球&#xff0c;偶尔朋友聚会 … 还能干什么呢&#xff1f; 当独自一人时&#xff0c;究竟可以做点什么&#xff0c;填补这空虚…

人工智能之深度学习_[4]-神经网络入门

文章目录 神经网络基础1 神经网络1.1 神经网络概念1.1.1 什么是神经网络1.1.2 如何构建神经网络1.1.3 神经网络内部状态值和激活值 1.2 激活函数1.2.1 网络非线性因素理解1.2.2 常见激活函数1.2.2.1 Sigmoid 激活函数1.2.2.2 Tanh 激活函数1.2.2.3 ReLU 激活函数1.2.2.4 SoftMa…

卸载和安装Git小乌龟、git基本命令

卸载 Git 打开控制面板&#xff1a; 按 Win R 打开运行对话框&#xff0c;输入 control 并按回车键。或直接在功能搜索里搜索“控制面板”。在控制面板中&#xff0c;选择“程序”或“程序和功能”。 查找并卸载 Git&#xff1a; 在程序列表中找到“Git”或“Git for Windows…

群论学习笔记

什么是对称&#xff1f; 对称是一个保持对象结构不变的变换&#xff0c;对称是一个过程&#xff0c;而不是一个具体的事物&#xff0c;伽罗瓦的对称是对方程根的置换&#xff0c;而一个置换就是对一系列事物的重排方式&#xff0c;严格的说&#xff0c;它也并不是这个重排本身…

C语言自定义类型:结构体

结构体简介&#xff1a; c语言里int 、float、double、等等类型来表示一个对象&#xff0c;但有时也有未能表达的对象&#xff0c;比如表示一个人的类型&#xff0c;这个类型里有人的身高、体重、年龄等等&#xff0c;这就需要很多个类型来拼凑&#xff0c;这就很不方便。于是…

【整体介绍】

ODO&#xff1a;汽车总行驶里程 Chime: 例如安全带没系的报警声音 多屏交互就是中控屏的信息会同步到主驾驶的仪表盘上 面试问题&#xff1a;蓝牙电话协议HFP 音乐协议A2DP 三方通话测试的逻辑

线性规划:机器学习中的优化利器

一、线性规划的基本概念 线性规划&#xff08;Linear Programming, LP&#xff09;是运筹学中数学规划的一个重要分支&#xff0c;用于在一组线性不等式的约束条件下&#xff0c;找到线性目标函数的最大值或最小值。其问题可以表述为&#xff1a; 在一组线性约束条件 s.t.&am…

SurgiTrack:外科手术视频中的细粒度多类别多工具跟踪|文献速递-视觉大模型医疗图像应用|文献速递-视觉大模型医疗图像应用

Title 题目 SurgiTrack: Fine-grained multi-class multi-tool tracking in surgical videos SurgiTrack&#xff1a;外科手术视频中的细粒度多类别多工具跟踪 01 文献速递介绍 手术器械跟踪在计算机辅助手术系统中发挥着至关重要的作用&#xff0c;可为一系列应用提供有价…