WPF 笔记3——在XAML中给对象属性赋值

news/2023/5/28 8:32:41

看B站刘铁猛老师视频学习WPF

XAML语言是从xml文件派生而来,是声明式语言,一个标签就表示声明了一个对象。

对象的值可以存储在对象的字段中,也可存储在对象的属性中;

通过给对象的属性赋值,可以在赋值时检查值的合法性,如果不合法可以抛异常给提示。

在XAML中给对象的属性赋值有3中方式:

  • Attribute=value
  • 属性标签
  • 标签扩展

1、Attribute=value

优点:简单快捷

缺点:不易给属性赋复杂值

<Rectangle Height="50" Width="200" Stroke="Red" Fill="Gold" RadiusX="20" RadiusY="10"></Rectangle> <Path Data="M 0,0 L 200,100  L 100,200 Z" Stroke="Red" Fill="Green" ></Path><!--Path对象的Data属性值稍复杂--><!--两个对象中都有Stroke属性,类型是Brush-->

Path对象的Data属性是Geometry类型, Data="M 0,0 L 200,100  L 100,200 Z"实现了对Data的赋值。然而这对于人来说是既不易阅读,也不易书写。

如果属性的类型比Data还复杂,就需要使用第二种方式进行赋值了。

补充:

两个对象中都有Stroke、Fill属性,类型都是Brush;

在xaml文件中,对Stroke属性赋的是字符串,这个字符串最后都被转换Stroke对象了 

这是怎么实现的呢?

(1)在后台文件中添加Person类

public class Person{/// <summary>/// 姓名/// </summary>public string Name { get; set; }/// <summary>/// 母亲/// </summary>public Person Mother { get; set; }/// <summary>/// 父亲/// </summary>public Person Father { get; set; }}

(2)在前台文件中添加资源

资源是通过key来检索的,资源中添加Person对象时候,需要指定一个key

<Window x:Class="WpfApp1.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:WpfApp1"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Window.Resources><!--资源是通过key来检索的,在资源中添加对象时需要指定key--><local:Person x:Key="pon" Name="Jeff" ></local:Person></Window.Resources><Grid><Button Width="100" Height="50" Content="Show" Click="Button_Click"></Button></Grid>
</Window>

(3)编辑Button_Click事件

private void Button_Click(object sender, RoutedEventArgs e){//通过key检索资源Person p = this.FindResource("pon") as Person;if (p == null){MessageBox.Show("空对象");}else{StringBuilder sb = new StringBuilder($"姓名:{p.Name}\n");if (p.Mother != null){sb .Append($"妈妈:{p.Mother.Name}\n");}if (p.Father != null){sb.Append($"爸爸:{p.Father.Name}\n");}MessageBox.Show(sb.ToString());}} 

运行效果:

(4)给Person的其他属性赋值

<local:Person x:Key="pon" Name="Jeff" Mother="Anna" ></local:Person>

运行效果:

(5)报异常了,显然我们不能给复杂属性(Mother、Father) 直接使用Attribute=value方式赋值,那么怎么样才能像前文中那样Stroke="Red" Fill="Gold"?

这就需要用到System.ComponentModel.TypeConverter类了

添加声明一个新类,继承自System.ComponentModel.TypeConverter

/// <summary>/// 通过重新ConvertFrom方法实现将一个简单类型,通过赋值,转换成一个复杂对象 /// </summary>public class NameToPersonTypeConvert : System.ComponentModel.TypeConverter{public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value){string name = value.ToString();Person person = new Person();person.Name = name;return person;//return base.ConvertFrom(context, culture, value);}}

(6)下一步就是把这个类附加到Person上,

    //将NameToPersonTypeConvert类以特性方式附加到Person类上[TypeConverterAttribute(typeof(NameToPersonTypeConvert))]public class Person{/// <summary>/// 姓名/// </summary>public string Name { get; set; }/// <summary>/// 母亲/// </summary>public Person Mother { get; set; }/// <summary>/// 父亲/// </summary>public Person Father { get; set; }}

运行效果:

通过以上步骤,就完成了给对象的复杂类型属性赋一个简单值 


2、属性标签

在xaml中,标签是用来声明对象的。

        <!--标签内容,是夹在开始标签和结束标签之间的部分。注意区分概念--><Button Width="100" Height="50" Content="这里是对象的内容">这里是标签的内容</Button>

属性标签的格式是:<类名.属性名></类名.属性名>

缺点:代码变多

示例1:

Button的Content是object类型

<Button Width="100" Height="50" ><Button.Content><Rectangle Width="20" Height="20" Stroke="Green" Fill="Green"></Rectangle></Button.Content></Button>

示例2:

Rectangle的Fill是Brush类型

        <Rectangle Width="400"  Height="400" Stroke="Blue"><Rectangle.Fill><!--设置渐变填充--><LinearGradientBrush><LinearGradientBrush.StartPoint><!--开始位置--><Point X="0" Y="0"></Point></LinearGradientBrush.StartPoint><LinearGradientBrush.EndPoint><!--结束位置--><Point X="1" Y="1"></Point></LinearGradientBrush.EndPoint><LinearGradientBrush.GradientStops><GradientStopCollection><!--设置描述渐变中转换点的位置和颜色--><GradientStop Offset="0.1" Color="Red"></GradientStop><GradientStop Offset="0.3" Color="Yellow"></GradientStop><GradientStop Offset="0.5" Color="Green"></GradientStop><GradientStop Offset="0.7" Color="Pink"></GradientStop><GradientStop Offset="0.9" Color="Pink"></GradientStop></GradientStopCollection></LinearGradientBrush.GradientStops></LinearGradientBrush></Rectangle.Fill></Rectangle>

补充:

(1)Brush的类图关系如下:

(2)注意要点

  • 能用attribute=value方式赋值是,就不要用属性标签;
  • 如果要赋的值正好是默认值,就不要用在属性标签中写出来;
  • 对于属性标签,如果属性值是一组集合,可以不写集合的名称,直接罗列集合元素

示例2的代码可优化成这种方式:

<Rectangle Width="400"  Height="400" Stroke="Blue"><Rectangle.Fill><!--开始点、结束点使用attri=value方式赋值 --><!-- StartPoint="0,0" EndPoint="1,1" 是LinearGradientBrush 的默认值,在这里可以不写--><LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <LinearGradientBrush.GradientStops> <!--属性标签是集合,可以直接罗列元素不写属性名称--><GradientStop Offset="0.1" Color="Red"></GradientStop><GradientStop Offset="0.3" Color="Yellow"></GradientStop><GradientStop Offset="0.5" Color="Green"></GradientStop><GradientStop Offset="0.7" Color="Pink"></GradientStop><GradientStop Offset="0.9" Color="Pink"></GradientStop> </LinearGradientBrush.GradientStops></LinearGradientBrush></Rectangle.Fill></Rectangle>

3、标签扩展

        标签扩展方式赋值与attribute=value赋值方式类型,只是这个value比较特殊,是花括号括起来的一组值。

        WPF中的标签扩展是有限的,我们只要掌握常用的即可
示例1

StaticResource 标签扩展

<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp1"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Window.Resources><!--在资源中定义字符串,这里需要添加命名空间如下xmlns:sys="clr-namespace:System;assembly=mscorlib"--><sys:String x:Key="strHello">Hello World</sys:String></Window.Resources><Grid><!--文本框显示的字符串来自Window.Resources--><TextBlock Height="30" Width="200" Background="LightYellow" Text="{StaticResource ResourceKey=strHello}"> </TextBlock><TextBlock Height="30" Width="200" Background="LightPink" Text="{StaticResource strHello}" Margin="262,251,330,138"></TextBlock></Grid>
</Window>

运行效果:

示例2

Binding标签扩展

    <Grid> <Grid.RowDefinitions><RowDefinition Height="30"></RowDefinition><RowDefinition Height="3"></RowDefinition><RowDefinition Height="30"></RowDefinition></Grid.RowDefinitions><TextBlock x:Name="tb" Text="{Binding ElementName=sld,Path=Value}" Width="150" Height="25" Background="LightCoral"></TextBlock><Slider x:Name="sld" Grid.Row="2" Value="50" Maximum="100" Minimum="0"  ></Slider> </Grid>

运行效果:

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

java 开始菜单 乱码_Win10电脑开始菜单及磁贴应用出现长英文乱码怎么办

Win10系统自发布以来&#xff0c;选择安装升级的用户越来越多&#xff0c;所以在使用过程中碰到的问题也就越来越多&#xff0c;就有win10系统用户发现升级之后开始菜单以及屏幕磁贴应用都变成了长英文乱码&#xff0c;这样分不清楚那个菜单应用选项是什么&#xff0c;该怎么解…

五年高考三年模拟暗部软件库_喵喵机MAX暑期发力,三年高考五年模拟自己在家就能打印出来...

不知不觉&#xff0c;距离上一款喵喵机P2上市也已经有一年多的时间了&#xff0c;一直期盼着能有新产品的面世&#xff0c;而喵喵机也不负众望&#xff0c;非常适时的在暑假期间推出了新品喵喵机MAX&#xff0c;不仅个头更大更简约&#xff0c;打印纸也比上一代产品大了不止一个…

在线作业帮智能计算机,作业帮喵喵机智能错题学习机 5秒解决错题学习的黑科技...

随着智能时代的到来&#xff0c; 科技育儿作为带娃新方式也逐渐成为主流&#xff0c;孩子的教育标准越来越高&#xff0c;其中科技帮忙解决了不少问题。前几天&#xff0c;孟妈去学校围观了孟子的同学作业互帮小组&#xff0c;那场面真的太壮观了&#xff01;孩子们围着一张圆桌…

css设置三角形以及三角形的旋转

一、三角形 代码展示: .box {margin: 100px auto;width: 0;height: 0;border: 10px solid transparent;/*三角形宽10px 边框为透明*/border-top-color: green;/*顶部边框为绿色*/border-bottom: none;/*底部去掉边框*/transition: all 0.5s ease 0s;/*设置动画效果 0.5秒完成…

java实现空心三角形

一、先上要实现的效果图&#xff1a; 二、分析思路&#xff1a; ## 1.如果刚开始看到这个需求没有思路&#xff0c;可以先实现非空心三角形&#xff0c;如下效果&#xff1a;##2.如果还是没有思路&#xff0c;可以再对需求进行扩充分析&#xff0c;实现半个非空心三角形&…

Python打印简单杨辉三角形

前言 杨辉三角形的定义&#xff1a;杨辉三角形 代码 #思路&#xff1a;用一个n2*n2的数组包住n*n的数组&#xff0c;初始化a[1][1]的值为1&#xff0c;遍历求a[i][j]a[i-1][j-1]a[i-1][j] def YHsanjiao(n):a[[0]*(n2) for i in range(n2)] #初始化一个二维数组a[1][1]1#打印…

css制作三角形

通常大家对css制作圆形的方法比较熟悉&#xff1a; <div id"circle"></div> //html代码 //css代码#circle{width:100px;height:100px;border-radius: 50px;background:#000 ;} 结果&#xff1a; 总结&#xff1a;在制做圆形之前&#xff0c;首先需要…

点是否在三角形内——C++实现

程序分析&#xff1a; 给定平面上一点p(x0,y0)&#xff0c;判断该点是否在三角形ABC中&#xff0c;三角形顶点坐标分别为A(xa,xb)、B(xb,yb)、C(xc,yc)。可以使用面积法来判断&#xff0c;方法如下&#xff1a;其中S(A,B,C)表示三角形ABC的面积。 &#xff08;1&#xff09;若a…

DT-6_TTL-WiFi透传模块介绍

DT-6_TTL-WiFi透传模块简介TTL-WiFi模块基于ESP-M2WiFi 模块研发&#xff0c;引出串口TTL、EN、STATE等引脚。产品内置我司最新版本的串口透传固件可完成设备TTL 端口到WiFi/云的数据实时透传&#xff0c;具备低功耗控制&#xff0c;状态指示等功能。本模块可直接取代原有的有线…

【第005问 Unity中如何显示三角形中心法线?】

Unity中如何查看三角形的中心法线 在004中可以快速的查看每个顶点的法线&#xff0c;那么如何查看每个三角形的中心法线呢&#xff1f; 一、先看看具体查看三角形中心法线的动画效果 查看Plane中每个三角形的中心法线 查看Cube中每个三角形的中心法线 查看Capsule中每个三角…

CSS知识梳理

CSS的三大特性 一 . 层叠性 : 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则 : 样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&#xff0c…

【智慧城市】模型生成-Blender-道路数据变成面数据

当导入道路时&#xff0c;只有一条线&#xff0c;如果需要做渲染等&#xff0c;需要将线转换为面 1、导入道路的shp文件&#xff0c;此处不需要调整&#xff0c;由于他只单单是一个线条 2、将way转换成线条&#xff1a;点击物体>转换>曲线 3、点击添加&#xff0c;NURB…

水经注道路宽度调到1以下

水经注道路宽度调到1以下水经注道路宽度调到1以下水经注道路宽度调到1以下 直接输入数据或者点击上下三角号不起作用&#xff0c;直接拖动滑块&#xff0c;虽然在1以下时&#xff0c;数字没有变动&#xff0c;道路效果却出来了&#xff0c;看左边道路宽度&#xff0c;确实是真实…

符合OpenDRIVE规范的xodr文件格式解读(1) ——road部分

以OpenDRIVE 1.5M为例&#xff0c;一个符合OpenDRIVE规范的xodr文件&#xff0c;可以分为如下这6大部分&#xff1a;文件头、道路、交通灯控制器、交叉口、交叉口组、车站。其中最最重要、内容最多的是道路部分&#xff0c;次重要的是交叉口部分。 &#xff08;一&#xff09;文…

linux三剑客之AWK

目录 AWK是什么 AWK基本结构 a.txt的文本实例 AWK内置变量 a.txt的文本实例 AWK自定义变量 a.txt的文本实例 AWK内置函数 a.txt的文本实例 awk高级输出 a.txt的文本实例 排序输出 a.txt的文本实例 条件选择输出 a.txt的文本实例 控制语句 a.txt的文本实例 AWK是什…

Open Street Map—2022年道路数据

道路数据是我们在各项研究中经常使用的数据&#xff01;道路数据虽然很常用&#xff0c;但是却基本没有能下载最近年份道路数据的网站&#xff0c;所以很多人不知道如何获到道路数据。 本次我们为大家推荐的下载道路数据的网站是Open Street Map&#xff01;我们先来了解下Ope…

OpenDRIVE地图第二篇:车道LANE

OpenDRIVE地图第二篇&#xff1a;车道LANE前言1 车道ID排序2 Lane sections3 Lane offset4 Lane linkage前言 在前讲过了参考线reference line&#xff0c;参考线是没有宽度的&#xff0c;车辆也无法通行&#xff0c;下面引入车道Lane,车道本身有宽度(width)&#xff0c;以及虚…

ArcGIS之计算面要素的宽度

&#xfeff;&#xfeff; 当我们在进行地图制图的时候&#xff0c;有时会需要选取图上宽度大于1mm的湖泊&#xff1b;又或者是我们有其它研究需求时&#xff0c;需要计算多边形的宽度。现在为大家介绍如何运用ArcGIS软件计算面要素&#xff08;多边形&#xff09;的宽度。 首…

k30最小宽度380不管用了_各场所疏散楼梯净宽度知识点归纳

各种场所的疏散楼梯净宽度在三本规范都有涉及&#xff0c;这些场所皆是常见场所&#xff0c;均有可能融合到案例分析题目中&#xff0c;现在把这些知识点进行归纳&#xff0c;同学们可结合图表加深对数字的记忆。规范原文&#xff1a;《建筑设计防火规范》&#xff08;GB50016-…

基于OpenCV的视频道路车道检测

基于OpenCV的视频道路车道检测基于OpenCV的视频道路车道检测前言综述运行方法车道检测的实现路面图像二值化基于透视变换提取车道区域基于二次多项式拟合车道线计算曲率半径与车辆的偏移距离用车道区域标注原始图像总结End.基于OpenCV的视频道路车道检测 前言 本篇博客作为博…