<StackPanel TextElement.FontSize="30" TextElement.FontStyle="Italic" Orientation="Horizontal"
HorizontalAlignment="Center" >
<!--
为什么是TextElement.FontStyle 而不是FontStyle
因为StackPanel没有FontStyle 这个属性,当XMAL解析器遇到这种语法的时候 他就要求TextElement(也叫附加属性提供者) 有个静态方法叫做SetFontSize,
这样它们才可以设置相应的属性值
C#代码
TextElement.SetFontStyle(panel,FontStyles.Italic);
像FontStyles.Italic 这样的枚举值 在xmal被简单的写成Italic,之所以可以这样写
是因为有.NET Framework中的EnumCoverter类型的转化器,它可以转换所有不去分辨大小写的字符串。
xmal很好的吧FontStyle作为StackPanel的逻辑附加属性
但是在C#告诉我们并没有什么神奇之处 仅仅是调用了与一个元素相关联的方法,
而那个元素中有一个与其他东西没有关系的属性
有意思的是.NET属性都不是附加属性
从内部看,SetFontSize这样的方法会只是调用DependencyObject.SetValue方法
通常每一个普通的依赖属性访问器都会调用同一个方法,但是这里调用的是传进来的DependencyObject上的
DependencyObject.SetValue方法 而不是当前实例的
public static void SetFontSize(DependencyObject element,double value)
{
element.SetValue(TextElement.FontSizeProperty,value);
}
与此类似附加属性也定义了一个静态方法叫做GetXXX(XXX是属性的名称) 它会调用我们属性的DependencyObject.GetValue方法
public static double GetFontSize(DependencyObject element)
{
return (double)element.GetValue(TextElement.FontSizeProperty);
}
与普通依赖属性的属性包装器一样 这些GetXXX和SetXXX方法只能调用GetValue和SetValue方法 不能挪为他用
-->
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">10</Button>
</StackPanel>