1. 使用标签的Attribute为对象属性赋值

​​XAML中为对象属性赋值_编译器​​

我们可以按上面的方式用字符串来赋值,但是比如上面的Fill其实Shape.Fill类型,那为什么我么可以赋Red呢?因为WPF使用TypeConverter进行了转换.

 

2. 使用TypeConverter类将XAML的Attribute与对象的Property进行转换

​​XAML中为对象属性赋值_WPF_02​​

 




​​view source​​​​print​​​​?​​



​1​

namespace​​ ​​DeepXAML ​


​2​

​{ ​


​3​

​[TypeConverter(​​​typeof​​​(StringToPersonConverter))] ​


​4​

public​​ ​class​​ ​​Person ​


​5​

​{ ​


​6​

public​​ ​string​​ ​​Name { ​​​get​​​; ​​​set​​​; } ​


​7​

public​​ ​​Person Child { ​​​get​​​; ​​​set​​​; } ​


​8​

​} ​


​9​

​}​


 




​​view source​​​​print​​​​?​​



​01​

namespace​​ ​​DeepXAML ​


​02​

​{ ​


​03​

public​​ ​class​​ ​​StringToPersonConverter:TypeConverter ​


​04​

​{ ​


​05​

public​​ ​override​​ ​object​​ ​​ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, ​​​object​​ ​​value) ​


​06​

​{ ​


​07​

if​​ ​​(value ​​​is​​ ​string​​​) ​


​08​

​{ ​


​09​

​Person p = ​​​new​​ ​​Person(); ​


​10​

​p.Name = value ​​​as​​ ​string​​​; ​


​11​

return​​ ​​p; ​


​12​

​} ​


​13​

return​​ ​base​​​.ConvertFrom(context, culture, value); ​


​14​

​} ​


​15​

​} ​


​16​

​}​


 




​​view source​​​​print​​​​?​​



​01​

public​​ ​partial​​ ​class​​ ​​MainWindow : Window ​


​02​

​{ ​


​03​

public​​ ​​MainWindow() ​


​04​

​{ ​


​05​

​InitializeComponent(); ​


​06​

​} ​


​07​

 


​08​

private​​ ​void​​ ​​Button_Click(​​​object​​ ​​sender, RoutedEventArgs e) ​


​09​

​{ ​


​10​

​Person p = (Person)​​​this​​​.FindResource(​​​​"Jack"​​​​); ​


​11​

​MessageBox.Show(p.Child.Name); ​


​12​

​} ​


​13​

​}​




​​view source​​​​print​​​​?​​



​1​

 


3. 标记扩展(Markup Extensions)

标记扩展是一种特殊的Attribute=value语法,Value是由一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做出解析,生成相应的对象。




​​view source​​​​print​​​​?​​



​1​

​<Grid> ​


​2​

​<StackPanel> ​


​3​

​<Button x:Name=​​​​"btnOk"​​​ ​​Width=​​​​"200"​​​ ​​Height=​​​​"100"​​​  ​​Click=​​​​"Button_Click"​​​​>OK</Button> ​


​4​

​<TextBox Text=​​​​"{Binding ElementName=btnOk, Path=Width,Mode=OneWay}"​​​  ​​Width=​​​​"200"​​​ ​​Margin=​​​​"10"​​​  ​​></TextBox> ​


​5​

​</StackPanel> ​


​6​

​</Grid>​


 

标记扩展是可以嵌套,有一些简写,比如{Binding Value,…}与{Binding Path=Value,…}等价;前者是固定位置参数,后者制定参数名字,位置顺序可以变动;标记扩展类的类名以Extension为后缀,但XAML里可以省略这个后缀。

4. 导入程序集和引用命名空间

上面的图片已经可以演示出来。


1. 使用标签的Attribute为对象属性赋值

​​XAML中为对象属性赋值_编译器​​

我们可以按上面的方式用字符串来赋值,但是比如上面的Fill其实Shape.Fill类型,那为什么我么可以赋Red呢?因为WPF使用TypeConverter进行了转换.

 

2. 使用TypeConverter类将XAML的Attribute与对象的Property进行转换

​​XAML中为对象属性赋值_WPF_02​​

 




​​view source​​​​print​​​​?​​



​1​

namespace​​ ​​DeepXAML ​


​2​

​{ ​


​3​

​[TypeConverter(​​​typeof​​​(StringToPersonConverter))] ​


​4​

public​​ ​class​​ ​​Person ​


​5​

​{ ​


​6​

public​​ ​string​​ ​​Name { ​​​get​​​; ​​​set​​​; } ​


​7​

public​​ ​​Person Child { ​​​get​​​; ​​​set​​​; } ​


​8​

​} ​


​9​

​}​


 




​​view source​​​​print​​​​?​​



​01​

namespace​​ ​​DeepXAML ​


​02​

​{ ​


​03​

public​​ ​class​​ ​​StringToPersonConverter:TypeConverter ​


​04​

​{ ​


​05​

public​​ ​override​​ ​object​​ ​​ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, ​​​object​​ ​​value) ​


​06​

​{ ​


​07​

if​​ ​​(value ​​​is​​ ​string​​​) ​


​08​

​{ ​


​09​

​Person p = ​​​new​​ ​​Person(); ​


​10​

​p.Name = value ​​​as​​ ​string​​​; ​


​11​

return​​ ​​p; ​


​12​

​} ​


​13​

return​​ ​base​​​.ConvertFrom(context, culture, value); ​


​14​

​} ​


​15​

​} ​


​16​

​}​


 




​​view source​​​​print​​​​?​​



​01​

public​​ ​partial​​ ​class​​ ​​MainWindow : Window ​


​02​

​{ ​


​03​

public​​ ​​MainWindow() ​


​04​

​{ ​


​05​

​InitializeComponent(); ​


​06​

​} ​


​07​

 


​08​

private​​ ​void​​ ​​Button_Click(​​​object​​ ​​sender, RoutedEventArgs e) ​


​09​

​{ ​


​10​

​Person p = (Person)​​​this​​​.FindResource(​​​​"Jack"​​​​); ​


​11​

​MessageBox.Show(p.Child.Name); ​


​12​

​} ​


​13​

​}​




​​view source​​​​print​​​​?​​



​1​

 


3. 标记扩展(Markup Extensions)

标记扩展是一种特殊的Attribute=value语法,Value是由一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做出解析,生成相应的对象。




​​view source​​​​print​​​​?​​



​1​

​<Grid> ​


​2​

​<StackPanel> ​


​3​

​<Button x:Name=​​​​"btnOk"​​​ ​​Width=​​​​"200"​​​ ​​Height=​​​​"100"​​​  ​​Click=​​​​"Button_Click"​​​​>OK</Button> ​


​4​

​<TextBox Text=​​​​"{Binding ElementName=btnOk, Path=Width,Mode=OneWay}"​​​  ​​Width=​​​​"200"​​​ ​​Margin=​​​​"10"​​​  ​​></TextBox> ​


​5​

​</StackPanel> ​


​6​

​</Grid>​


 

标记扩展是可以嵌套,有一些简写,比如{Binding Value,…}与{Binding Path=Value,…}等价;前者是固定位置参数,后者制定参数名字,位置顺序可以变动;标记扩展类的类名以Extension为后缀,但XAML里可以省略这个后缀。

4. 导入程序集和引用命名空间

上面的图片已经可以演示出来。