0%

WPF之属性赋值的方式

属性=Value形式

  • 这种形式适用于对属性赋比较简单的值,例如Width=“100”或Height=“200”是xaml中属性赋值最常用的方式。比较复杂的赋值,如Path
    <Path Data="M 0,0 L 200,100 L 100,200 Z" Fill="Red" Stroke="Black"/>
  • 可在窗口上画出一个红色的三角形

WPF

属性标签形式

  • 我们能发现在对属性赋值时,赋的都是字符串,但其实很多控件的属性不是string类型的,那WPF如何把赋的字符串类型转换为相应的类型呢?答案就是重写TypeConverter中的方法

  • 在.cs文件中声明一个Human类:

1
2
3
4
5
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
}
  • 然后在.xaml文件中添加窗口资源,声明一个Human类:
1
2
3
<Window.Resources>
<local:Human x:Key="human" Name="John" Child="Little John"/>
</Window.Resources>
  • 在这里Key是Human对象的索引值,当需要用到该对象时,可以用human使用此对象,后面可对human对象的属性进行赋值,由于Name属性本来就是string类型,所以直接赋值是合法的,但Child属性是Human类型,像上面那样赋值会报出类型转换的错误。想要解决这个问题就必须在.cs文件中重写类型转换方法,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[TypeConverterAttribute(typeof(NameToHumanTypeConverter))]
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
}

public class NameToHumanTypeConverter : TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string name = value.ToString();
Human child = new Human();
child.Name = name;
return child;
}
}
  • 声明一个类用来继承TypeConverter类,重写TypeConverter中的ConvertFrom方法,再使用类型转换器把该特性绑定到Human类上

标签扩展形式

  • 在xaml文件中,如果属性所要赋的值很复杂的话,可以把属性以一个闭合的形式把内容包括进来,例如,定义一个应用了渐变笔刷的长方形:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Rectangle Width="200" Height="160" Stroke="Blue">
<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="DarkBlue"/>
<GradientStop Offset="1" Color="Blue"/>
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
  • 效果如下:

WPF

  • 该代码可以简化成如下:
1
2
3
4
5
6
7
8
9
10
11
<Rectangle Width="200" Height="160" Stroke="Blue" RadiusY="99.5" RadiusX="99.5">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="LightBlue"/>
<GradientStop Offset="0.7" Color="DarkBlue"/>
<GradientStop Offset="1" Color="Blue"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>

-------------本文结束感谢您的阅读-------------