给XAML对象赋值的三种方式
1. 第一种:通过在标签中Attribute:value
. 下图中框起来的就是使用了这种方式,当然,这也是我们最常见的一种方式,操作简单。Title="MainWindow"表示另窗体的标题显示设置为MainWindow,Height,Width俩属性设置窗体的高度和宽度,和HTML很像哦。
说几个常用的属性:
Height:高度
Width:宽度
Backgroung:设置背景色
WindowStartupLocation:窗体程序启动时在屏幕的显示位置,有三个参数,一般我们都会使用CenterScreen这个参数吧,表示显示在屏幕正中央。
属性巨多,就不列举了
当然这种方式给简单属性赋值比较方便,但是复杂属性就比较麻烦了,需要记住书写方式。
如上图,我们使用Path标签画了一个黄色的矩形。Stroke属性表示画笔的颜色,这里是黑色,Fill属性表示该图形的填充颜色,Data属性是个很长的值。可将该值分为五段:
M 10,10 表示画笔起点坐标为(10,10),M表示起始点
L 10,60 表示从前一个点(也就是起点)画一条直线到坐标(10,60)
L 60,60 表示从前一个点(10,60)画一条直线到坐标(60,60)
L 60,10 表示从前一个点(60,60)画一条直线到坐标(60,10)
Z 表示结束了,将最后一点与起始点连接起来,组成一个图形
通过标签给属性赋值:但是我们发现Attribute:value的赋值方式,value始终都是一个字符串,但在实际情况中,如下:
<Path Stroke="Black" Fill="Yellow" Data="M 10,10 L 10,60 L 60,60 L 60,10 Z"/>
其中,Stroke与Fill为Brush类型
public Brush Stroke { get; set; }
Data为Geometry类型
public Geometry Data { get; set; }
那么程序中如何将我们赋的值成功转换为程序需要的值类型,下面举个例子来说明:
在程序中写出这个类:
public class Person
{
public string Name { get; set; }
public Person MyChild { get; set; }
}
该Person是我自己写的,但作为该程序的一个资源,还需要手动添加到我的程序中。
首先引入本地命名空间(我使用的VS2017,在新建项目的时候给我自动添加了,别的版本不知):
命名为local(最好命名成local)
xmlns:local="clr-namespace:HelloWPF"
然后加入Window资源节点
Person:表示我建的Person对象
Key:键,等于一个标识吧
Name:我的Person对象中的Name属性,并赋值为“哈哈哈one”
窗口和按钮画好,
添加按钮点击事件
运行演示
以上的比较好理解,下面我们对Peron对象的MyChild属性赋值
<Window.Resources>
<local:Person x:Key="person" Name="哈哈哈one" MyChild="我是Son"/>
</Window.Resources>
注意:MyChild属性可是Person类型的,不是string。
而我们给它赋值为字符串“我是Son”,那么代码如何实现类型转换呢?
首先新建一个类,重写俩方法:
上代码:
public class MyMethod : TypeConverter
{
//重写ConvertFrom方法
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string name = value.ToString();
Person person = new Person();
person.Name = name;
return person;
}
//重写CanConvertFrom方法,返回值必须为true。
//意思是:返回该转换器是否可以将给定类型的对象转换为此转换器的类型。
//设定返回值为true,否则,在xaml代码中无法将会提示MyChild无法转化
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return true;
}
}
给Person类打标签[TypeConverterAttribute(typeof(MyMethod))],意为该类是需要转换的类。
//通过将指定类型用作该属性所绑定到的对象的数据转换器,
//初始化 TypeConverterAttribute 类的新实例。
//简单点就是Person对象使用我自己定义的MyMethod
[TypeConverterAttribute(typeof(MyMethod))]
public class Person
{
public string Name { get; set; }
public Person MyChild { get; set; }
}
改一下button的点击事件
private void Button_Click(object sender, RoutedEventArgs e)
{
Person person = FindResource("person") as Person;
if (person != null)
{
MessageBox.Show(person.MyChild.Name);
}
}
运行演示
今天结束!!!!