zoukankan      html  css  js  c++  java
  • Silverlight 属性样式、控件模板、视觉状态

    在使用Silverlight的样式的时候感觉非常好,以前在HTML上很难实现的效果在这里都变的如此简单。

    属性样式

    控件的属性样式好比CSS的Class功能定义,是用来统一定义和维护控件属性的方式,控件属性样式根据生命的位置不同分为三种范围的作用域

    全局样式

    全局样式声明在App.Xaml 文件中具有整个项目的使用范围能力

    <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                 x:Class="Sample.App"
                 >
        <Application.Resources>
            <!--样式定义位置,定义在这里可以让整个项目都可以访问到这个样式的定义-->
        </Application.Resources>
    </Application>
    

    局部样式

    局部样式使用<UserControl.Resources> 这个元素定义,具有文件级别的访问范围

    <!--定义用户控件资源-->
    <UserControl.Resources>
        <!--定义按钮样式1 TargetType 代表适合的控件类型 这里是Button控件-->
        <Style x:Key="button1" TargetType="Button">
            <!--背景色 Background =  Black-->
            <Setter Property="Background" Value="Black"/>
            <!--字号-->
            <Setter Property="FontSize" Value="24"/>
            <!--字颜色-->
            <Setter Property="Foreground" Value="Blue"/>
            <!--字间距-->
            <Setter Property="Margin" Value="20"/>
        </Style>

    </UserControl.Resources>

    <!--应用样式1的按钮-->
        <Button Content="兰色" Width="150" Height="80"
                Style="{StaticResource button1}" />

    内部样式

    内部样式代表在元素的级别上来生命的资源,具有这个容器或者控件的使用范围

    <Button Content="红色" Width="150" Height="80">
            <Button.Style>
                <!--定义按钮样式3-->
                <Style TargetType="Button">
                    <!--背景色-->
                    <Setter Property="Background" Value="Red"/>
                    <!--字号-->
                    <Setter Property="FontSize" Value="24"/>
                    <!--字颜色-->
                    <Setter Property="Foreground" Value="Red"/>
                    <!--字间距-->
                    <Setter Property="Margin" Value="20"/>
                </Style>
            </Button.Style>
        </Button>

    样式支持继承的方式访问,在父容器元素定义的样式其内部的包含的控件也可以使用这个样式,下面的Button就使用了其父容器控件中的资源。

    <Grid x:Name="LayoutRoot" Background="White">
        <!--定义Grid控件的资源-->
        <Grid.Resources>
            <Style x:Key="button" TargetType="Button">
                <Setter Property="Width" Value="260"/>
                <Setter Property="Height" Value="160"/>
                <Setter Property="FontSize" Value="26" />
                <Setter Property="Content" Value="应用父级样式"/>
            </Style>
        </Grid.Resources>
        <!--应用父级样式的按钮-->
        <Button Style="{StaticResource button}"></Button>
    </Grid>

    控件模板

    控件模板用于个性化的去定义控件的外观,可以使用Blend或者是手动去使用XAML编写组合一个你所想要的控件外观,比如圆形的按钮等等,同时这个控件本身依然具有控件本身的功能作用。

    他的定义是Style的一个扩展,只要在Style中添加Property="Template" 的Setter 标记 并在Value中定义即可

    <UserControl.Resources>
        <!--定义样式1-->
        <Style x:Key="MyButton1" TargetType="Button">
            <!--使用模板属性-->
            <Setter Property="Template">  ----------代表索要定义的是一个模板
            <Setter.Value>       ---------- 这个标记中可以包含模板定义
                <!--定义模板1-->
                <ControlTemplate TargetType="Button">              -------模板的适用与Button,这个元素的内部开始定义这个Button模板的外观
                <Grid Cursor="Hand" Margin="20">
                    <Ellipse Width="150" Height="100"
                     HorizontalAlignment="Center"
                     VerticalAlignment="Center">               -----椭圆形
                        <Ellipse.Fill>          -----填充使用黄色到白色的渐变
                            <RadialGradientBrush>
                                <GradientStop Color="Gold"
                                  Offset="1"/>
                                <GradientStop Color="White"
                                  Offset="0"/>
                            </RadialGradientBrush>
                        </Ellipse.Fill>
                    </Ellipse>
                    <!--使用TemplateBinding-->
                    <TextBlock FontSize="24"
                       Foreground="Blue"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Text="{TemplateBinding Content}" />           ----文本的定义使用TextBlock标记,并将Text 与 具体的Button 的Content 属性 的值关联起来
                </Grid>
                </ControlTemplate>
            </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    <StackPanel Width="400" Height="300"
                HorizontalAlignment="Center"
                Orientation="Horizontal"
                VerticalAlignment="Center"
                Background="White">
        <!--应用样式1-->
        <Button Style="{StaticResource MyButton1}" Content="我的控件" />   ----使用样式的名称即可
        <!--应用样式1-->
        <Button Style="{StaticResource MyButton1}" Content="按钮内容" />
    </StackPanel>

    视觉状态

    视觉状态也是Style的一个扩展,在Silverlight 的样式中控件在某个状态下的不同效果也是可以定义的,比如鼠标在按钮悬停时候按钮的样子啊,按下按钮的样子啊等等。

    当然和Style一样,每种按钮都有不同的属性也会有不同的状态。那么我们如何得知控件有那些状态呢,方法很简单,只要 右键选中一个控件,转到定义,在元数据里面就会看到他的状态都有那些了。

     // Summary:
        //     Represents a button control.
        [TemplateVisualState(Name = "Focused", GroupName = "FocusStates")]
        [TemplateVisualState(Name = "Normal", GroupName = "CommonStates")]
        [TemplateVisualState(Name = "MouseOver", GroupName = "CommonStates")]
        [TemplateVisualState(Name = "Pressed", GroupName = "CommonStates")]
        [TemplateVisualState(Name = "Disabled", GroupName = "CommonStates")]
        [TemplateVisualState(Name = "Unfocused", GroupName = "FocusStates")]
        public class Button : ButtonBase
    

    上面的特性就是视觉状态了,我们就要重新定义这些Name的状态。

    <UserControl.Resources>
        <!--定义样式标记-->
        <Style x:Key="buttonVSM" TargetType="Button">
            <!--定义样式属性-->
            <Setter Property="Foreground" Value="Yellow"/>
            <Setter Property="Template">
            <Setter.Value>
            <!--定义控件模板-->
            <ControlTemplate TargetType="Button">
            <Border CornerRadius="10" BorderBrush="Black"
                    BorderThickness="3" Width="240" Height="80"
                    x:Name="RootElement">
                <Border.Background>
                    <!--定义背景画刷-->
                    <SolidColorBrush
                        x:Name="BorderBrush"
                        Color="Green"/>
                </Border.Background>
                <!--视觉状态管理组-->
                <VisualStateManager.VisualStateGroups>
                <VisualStateGroup>
                    <!--定义状态迁移-->
                    <VisualStateGroup.Transitions>        ----------迁移代表不同状态之间切换的过程
                    <!--从Normal到MouseOver迁移间隔时间-->
                    <VisualTransition To="MouseOver"
                     GeneratedDuration="0:0:0.5" />
                    <!--从Pressed到MouseOver的迁移间隔时间-->
                    <VisualTransition From="Pressed"
                                      To="MouseOver"
                     GeneratedDuration="0:0:0.01" />
                    <!--从MouseOver到Normal的迁移-->
                    <VisualTransition From="MouseOver"
                                      To="Normal"
                     GeneratedDuration="0:0:1.5">
                      <Storyboard>
                        <!--使用关键帧动画改变按钮背景色-->
                        <ColorAnimationUsingKeyFrames
                          Storyboard.TargetProperty="Color"
                          Storyboard.TargetName="BorderBrush">
                         <ColorAnimationUsingKeyFrames.KeyFrames>
                           <LinearColorKeyFrame
                               Value="Blue" KeyTime="0:0:0.5" />    ---- 0.5 秒Blue 色
                           <LinearColorKeyFrame
                               Value="Yellow" KeyTime="0:0:1" />       ---1秒 Yellow色
                           <LinearColorKeyFrame
                               Value="Green" KeyTime="0:0:1.5" />       ----1.5秒Green色
                         </ColorAnimationUsingKeyFrames.KeyFrames>
                        </ColorAnimationUsingKeyFrames>
                      </Storyboard>
                    </VisualTransition>
                </VisualStateGroup.Transitions>
                    <!--按钮普通状态-->
                    <VisualState x:Name="Normal" />
                    <!--鼠标经过按钮的状态-->
                    <VisualState x:Name="MouseOver">
                    <Storyboard>
                        <ColorAnimation
                         Storyboard.TargetName="BorderBrush"
                         Storyboard.TargetProperty="Color"
                         To="Red" />             ----动态将BorderBrush 的Color 属性值过度到Red
                    </Storyboard>
                    </VisualState>
                    <!--按钮按下状态-->
                    <VisualState x:Name="Pressed">
                    <Storyboard >
                        <ColorAnimation
                         Storyboard.TargetName="BorderBrush"
                         Storyboard.TargetProperty="Color"
                         To="Transparent" />
                    </Storyboard>
                    </VisualState>
                </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <!--显示按钮文本-->
                <ContentPresenter
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Content="{TemplateBinding Content}"/>
            </Border>
            </ControlTemplate>
            </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <!--按钮对象-->
        <Button Style="{StaticResource buttonVSM}"
                FontSize="24" Background="Red"
                Content="视觉状态按钮"/>
    </Grid>

    冯瑞涛
  • 相关阅读:
    写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
    工作1个月+1个星期
    矫正骨盆前倾!平坦小腹!解决腰痛!
    《非暴力沟通》
    了不起的盖茨比
    X战警系列
    Docker常用命令大全
    学习笔记12
    电子公文传输系统1个人贡献
    实验四 Web服务器2
  • 原文地址:https://www.cnblogs.com/finehappy/p/1668562.html
Copyright © 2011-2022 走看看