1.XAML注释是什么样子的?
在之前的章节有提起过,但是这一节我还是想系统的学习XAML,XAML的注释如下
<!--
//这其中填写注释
-->
Notice:在注释的部分编译器是不编译的
2.XAML的属性和事件
1 简单属性和转化器
Q :简单属性我了解,比如button有内容等属性,但是转化器是什么我不得理解?反正我不得理解。
在这里我想用一个例子来解释一下:应为我觉得主要在实战中理解
<StackPanel Orientation="Vertical">
<TextBox Name="tbox" Text="12"></TextBox>
<TextBlock Name="dd" Text ="25" FontSize="20"></TextBlock>
</StackPanel>
这里我会发现Name="tbox" Text="12"这些属性给出的值都是字符串,那么这到底是怎么回事?不光光这几个所有的都是。FontSize="20"这里面的20 我感觉应该是个double ,
之前我讲过C#和XAML是互通的,这时候我就想在C#中设置字体大小。
dd.FontSize = "20";在C#中这样写是错误的。
dd.FontSize = 20 而这样是对的。可以转到FontSize 的定义如下:
public double FontSize { get; set; } 人家确实需要的是一个double ,此时我的猜想出来了。
<StackPanel Orientation="Vertical">
<TextBox Name="tbox" Text="22"></TextBox>
<TextBlock Name="dd" Text ="25" FontSize="{Binding Path=Text,ElementName =tbox}"></TextBlock>
</StackPanel>
可以看到当输入不同的值,字体的大小会发生变化,这就转化器在其中干的事情,自动的将我输入的“22”转化为了数字。
Q:我输入22 字体就变成了22 ,输入34字体就变成了34,这个转化器真厉害,咋就这么能的,得瑟。如果我改成汉字二十会怎么样? 不能
为什么可以将字符串的数字转化为十进制的数字?而我输入的汉字却不能输转化。这是因为转化器内部已经定义了将字符串转化为double类型,而没有写把我的汉字转化成double类型。
---------------------------------------------------------------此时我有一个大胆的想法----------------------------------------------------------------------
能不能我自己写一个转化器,把汉字转化为double类型?
我觉得理论上是可以的,因为转化器竟然可以将字符串转化为double,我觉得把汉字类型转换为double也是一样的。
2.那么如何自定义转化器?
public class myconverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//自定义的转化器
switch (value)
{
case "二十":
return 20.0;
case "五十":
return 50.0;
}
throw new NotImplementedException();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
IValueConverter是个接口,在类中实现这个接口,但是在实现这个接口的时候发现有2个接口函数,这是怎么回事?
原因要在之前的章节中寻找,因为XAML和C#本身就是一个整体,前台的代码可以将字符串通过转化给后台代码使用,同样后台的代码也可以转换成字符串给前端的界面调用。所以会存在2个转换函数,就是上面的图是个双向过程,这下就瞬间豁然开朗。美滋滋
在这其中几乎所有的XAML属性,内部已经完成了转化器,所以不需要手动添加。
2 复杂属性
Q:什么是复杂属性?
我的理解是不能够通过一句字符串来表示出来,之前的简单属性都是给个字符串就可以。
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Button Grid.Row="0" Content=" Hello World"></Button>
</Grid>
比如我需要将一个按钮防止在Grid的第1行,这个通过简单属性是无法描述的。
3.标记扩展
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Name="TEXT" Text=" 5"></TextBox>
<TextBlock Grid.Row="1" Text="25" FontSize="{Binding Path=Text,ElementName=TEXT}"></TextBlock>
</Grid>
标记扩展语言以{}开始,所有的内容都在{}里面实现:
FontSize="{Binding Path=Text,ElementName=TEXT}"实现的就是扩展语言,目前理解标记扩展有点费劲我也是
简单理解就是当我们无法使用简单标记去实现的时候就需要使用标记扩展在{}里面,里面实现好多语句,表达式之间用逗号隔开,表达式的内容可以十分丰富。
4.附加属性
附加属性这个非常好理解,子元素依赖父元素,所以说是附加在这之上的属性。
<TextBox Grid.Row="0" Name="TEXT" Text=" 5"></TextBox>
Grid.Row="0"这个属性本来没有,是我使用了父类的属性才可以实现的。
------------------------结束
------------------------后期继续更新,欢迎大家一起相互学习探讨 ,作者会不断更新,有什么问题可以留言。
------------------------我始终相信一支独放不是春,万紫千红春满园。希望有更多优秀的小伙伴加入其中。
------------------------如果有写错的地方,欢迎大家指出来,欢迎加入。