WPF-Xaml

  1. 1. 附加属性
  2. 2. Content属性
  3. 3. 类型转换器
    1. 3.1. 自定义类型转换器
  4. 4. 标记扩展

Do not just seek happiness for yourself.Seek happiness for all.Through kindness.Through mercy.

David Levithan,Wide Awake

附加属性

附加属性是可以用于多个控件,但是在另一个类中定义的属性.附加属性的命名方式是”定义类型.属性”.这样可以让Xaml解析器将其与普通属性区分开.附加属性的设置可以使用Attribute和Property-Element语法.使用后者时类型必须是包含该属性的类型.

Content属性

类型转换器

所有的类型转换器都派生自TypeConverter,TypeConverter提供的4个重要方法是CanConvertTo,CanConvertFrom,ConvertTo和ConvertFrom.
ConvertFrom方法将Xaml中的字符串转换为相应的CLR对象.ConvertTo方法将CLR对象转换为相应的字符串.CanConvertFrom用来检查能否从字符串转换为相应的CLR对象.CanConvertTo检查ClR对象能否转换为相应的字符串.可以true.

自定义类型转换器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
[TypeConverter(typeof(MoneyConverter))]
public class MoneyType
{
private string _value;

public MoneyType()
{
_value = "0";
}

public MoneyType(string value)
{
_value = value;
}
public override string ToString()
{
return _value.ToString();
}
public static MoneyType Parse(string value) {
string str = (value as string).Trim();
if (str[0] == '$') {
string newprice = str.Remove(0,1);
double price = double.Parse(newprice);
return new MoneyType("¥" + (price * 7.24).ToString("0.00"));
}
else if (str[0] == '¥')
{
string newprice = str.Remove(0, 1);
double price = double.Parse(newprice);
return new MoneyType("$" + (price / 7.24).ToString("0.00"));
}else
{
double price = double.Parse(str);
return new MoneyType(""+price);
}
}
}

public class MoneyConverter : TypeConverter
{
/// <summary>
/// 对象转换为Xaml字符串是否
/// </summary>
/// <param name="context"></param>
/// <param name="sourceType"></param>
/// <returns></returns>
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if(sourceType==typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
/// <summary>
/// Xaml上下文转换为对应类型
/// </summary>
/// <param name="context"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(string))
return true;
return base.CanConvertTo(context, destinationType);
}
/// <summary>
/// 将Xaml上下文转换为对象
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <returns></returns>
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value.GetType()!=typeof(string))
{
return base.ConvertFrom(context, culture, value);
}
return MoneyType.Parse((string)value);
}
/// <summary>
/// 将对象转为Xaml上下文
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if(destinationType==typeof(string))
return base.ConvertTo(context, culture, value, destinationType);
return value.ToString();
}
}

标记扩展

{x:null}表示一个空值 {x:static}代表引用一个类的静态变量 {}{HelloXaml}表示普通字符串