xaml的威力和限制 ---学习笔记二

从某种意义上讲编写成寻是为了避免重复的劳动,用于xaml只是一种标记语言而不是真的编程语言,因此它的重复存在很多潜在的问题,通常采用方案是采用silverlight样式,但样式的先决条件是一种更为普遍的共享机制:资源

xaml资源:常常作为特殊的.net类或结构体的实例,类的实例在引用该资源的各个对象之前共享。

注意资源是共享的,很多类不能定义为xaml资源例如 TextBlock的单个实例不允许被多次使用,因为当TextBlock必须有一个唯一的父元素,并在父元素中有唯一确定的位置。依此类推也适用于其他元素,由于不能共享从UIElement派生的任何元素都不能以资源的形式出现。

xaml资源的存储:FaramworkElement定义了一个ResourceDictionary类型的Rseourees属性。所以对于派生自FramworkElement的所有元素,都可以将resoureces定义为属性元素。Resoureces标签范围内的资源集合可以被称为一个资源片段。visual studio 创建程序时有一个app.xaml文件包含一个空的资源片段:

<!--应用程序资源-->
<Application.Resources>
</Application.Resources>

Application类中定义的资源能在整个应用程序中使用。而FrameworkElement的Resources集合中定义的资源只能在Frameworkelement元素及其子元素中使用。

下面来看看比较典型的xaml资源

1 共享画刷,最典型的就是给应用程序一致且独特的外观。资源必须先使用后定义。

<phone:PhoneApplicationPage>

<phone:PhoneApplicationPage.Resources>
        <LinearGradientBrush x:Key="bruh">
            <GradientStop Offset="0" Color="RoyalBlue"></GradientStop>
            <GradientStop Offset="1" Color="red"></GradientStop>
        </LinearGradientBrush>
    </phone:PhoneApplicationPage.Resources>

<Grid x:Name="LayoutRoot" Background="Transparent">
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="xxx" Text="testresource" Foreground="{StaticResource bruh}"></TextBlock>
    </StackPanel>
</Grid>

</phone:PhoneApplicationPage>

如果要共享设置margin,该怎么设置?因为margin是Tinckness类型

<Thickness x:Key="margin">
    12 92
</Thickness>

某些资源需要引用到c#的一些数据类型如 fontsize属性他是double类型的结构体,所以需要引入.net命名空间

xmlns:system="clr-namespace:System;assembly=mscorlib" 引入公共运行库

<system:Double x:Key="fize">
    48
</system:Double>
x:key键名字一个资源片段中是唯一的,但是在不同的资源集合中可用重复。

资源搜索是沿着可视化话树向上进行的,因而另一个分子中的资源就会被忽略。

那代码中如何访问资源?

假如在主页面mainpage的resource集合中名为brush的资源

this.Resources[“brush”],然后可以将该对象转换为一个合适的类型,注意:只有页面初始化以后才能在页面隐藏文件代码中访问资源。

也可以用x:name标示资源,在整个xaml文件中必须是唯一的。

<phone:PhoneApplicationPage.Resources>

<LinearGradientBrush x:Name="bruh">
<GradientStop Offset="0" Color="RoyalBlue"></GradientStop>
<GradientStop Offset="1" Color="red"></GradientStop>
</LinearGradientBrush>

</phone:PhoneApplicationPage.Resources>

代码访问:txtblock.Foreground=brush;

好处显而易见了,可以像其它代码中的字段一样,在代码隐藏文件中引用该资源。xaml与代码之间共享资源的好办法。

2,下面学习常用的样式 style,它基本上是为特定类型分配的集合属性,除了一个键外,还有TrargetType指定元素类型,style标签之间有一个或多个setter,一个是property指定属性名,另一个value指定值。
<phone:PhoneApplicationPage.Resources>

    <Style x:Key="txtstyle" TargetType="TextBlock">
        <Setter Property="HorizontalAlignment" Value="Center"></Setter>
        <Setter Property="Margin" Value="12 96"></Setter>
        <Setter Property="Width" Value="98"></Setter>
        <Setter Property="Height" Value="100"></Setter>
        <Setter Property="Foreground">
            <Setter.Value>
                <LinearGradientBrush>
                    <GradientStop Offset="0" Color="Pink"></GradientStop>
                    <GradientStop Offset="1" Color="Blue"></GradientStop>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
    </Style>
</phone:PhoneApplicationPage.Resources>

style应用到一个textblock类型元素上,需要设置style属性
<TextBlock Text="1" Style="{StaticResource txtstyle }" x:Name="ss" ></TextBlock>

样式继承
<Style x:Key="txtstyles" TargetType="TextBlock" BasedOn="{StaticResource txtstyle}">
    <Setter Property="Width" Value="100"></Setter>
    <Setter Property="Height" Value="120"></Setter>
</Style>
注意优先级设置:

本地最高>样式设置>属性继承>默认

3 主题

windows phone 7预定义了很多的资源,可以通过手机设置更改主题,换用不同的资源。

4 渐变强调:通俗的讲同样的色调,但要获取较暗或较亮版本

<Grid.Background>
    <LinearGradientBrush StartPoint="0 0" EndPoint="0 1">
        <GradientStop Offset="0" Color="White"/>
        <GradientStop Offset="2" Color="Black"></GradientStop>
    </LinearGradientBrush>
</Grid.Background>

 


错误地方希望大家指正,谢谢!

明天学习 xaml中的复杂布局。

posted @ 2012-04-13 01:12  Liuxiucai  阅读(259)  评论(0)    收藏  举报