首页 > 代码库 > WP8.1 UI 编程 二、样式和模板

WP8.1 UI 编程 二、样式和模板

1. 每个控件都有一个Resources属性,把样式放在这个Resources里,就可以作为静态资源给这个控件的可视化树下的控件使用。如果定义在Page上,则整个页面都可以使用;同样Application上整个App都可以使用。

Style的TargetType属性不一定要和使用这个样式的控件类保持一致,可以设置为它的父类。例如,设置为FrameworkElement也可以被TextBlock使用。

要Style实现继承,只需设置它的BasedOn属性。

Style可以以编程方式动态创建和设置。

Style应用后就无法修改,要更改已应用样式的控件的样式,必须设置为另一个样式。

Style可以单独写在XAML文件里,如:

<ResourceDictionary   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">    <!--这里就可以写Style了--></ResourceDictionary>

要添加所需的Style,只需在相关Resources属性下添加:

<ResourceDictionary>            <ResourceDictionary.MergedDictionaries>                <ResourceDictionary Source="样式XAML的URI"/>            </ResourceDictionary.MergedDictionaries></ResourceDictionary>

系统主题资源在:C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.1\Design

如何实现简单的自定义/多主题?

WP的主题资源是可以在代码中动态修改的,直接修改就可以实现。

 

2. 模板分为ControlTemplate和DataTemplate。

ControlTemplate可以通过修改控件内部的可视化树结构,来完成定制控件内部的布局和内容。只需将声明的ControlTemplate对象赋值给控件的Template属性。

使用TemplateBinding语法可以将ControlTemplate中的元素属性与控件本身的属性关联。

 

ControlPresenter,用来显示ContentControl及其子类(如Button)的Content属性。Content属性是object类型。

当定义了Content属性后,把它投影到ControlPresenter的Content属性,就可以显示Content内容了。

下面是例子,代码直接复制的,废话比较多。

<Button >                    <Button.Template>                        <ControlTemplate >                            <Grid>                                <Ellipse Width="{TemplateBinding Button.Width}" Height="{TemplateBinding Control.Height}"                                                 Fill="{TemplateBinding Button.Background}" Stroke="Red"/>                                <TextBlock Margin="5,0,0,0" FontSize="50" VerticalAlignment="Center" HorizontalAlignment="Center"                                                Text="{TemplateBinding Button.Content}" />                                <TextBlock FontSize="50" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"                                                Text="{TemplateBinding Button.Content}" />                                <ContentPresenter  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"                                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>                            </Grid>                        </ControlTemplate>                    </Button.Template>                    <Button.Content>                        <Rectangle Fill="Red" Height="50" Width="50"></Rectangle>                    </Button.Content>                </Button>

VisualStatesManager可管理控件的视觉状态(比如Button点按的视觉效果)。

在控件上设置VisualStatesManager.VisualStateGroups属性来添加视觉状态组。

VisualState:视觉状态(如Button默认就包括Normal、MouseOver等6种状态),主要使用它来自定义。

VisualStateGroup.Transitions:切换视觉状态的过渡动画,可选。

示例:

<VisualStateManager.VisualStateGroups>                                    <VisualStateGroup x:Name="CommonStates">                                        <VisualStateGroup.Transitions>                                            <!--状态Test1转化为状态Test2的颜色变化动画-->                                            <VisualTransition From="Test1" To="Test2" GeneratedDuration="0:0:1.5">                                                <Storyboard>                                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Color" Storyboard.TargetName="BorderBrush" FillBehavior="HoldEnd" >                                                        <ColorAnimationUsingKeyFrames.KeyFrames>                                                            <LinearColorKeyFrame Value="Blue" KeyTime="0:0:0.5" />                                                            <LinearColorKeyFrame Value="Yellow" KeyTime="0:0:1" />                                                            <LinearColorKeyFrame Value="Black" KeyTime="0:0:1.5" />                                                        </ColorAnimationUsingKeyFrames.KeyFrames>                                                    </ColorAnimationUsingKeyFrames>                                                </Storyboard>                                            </VisualTransition>                                        </VisualStateGroup.Transitions>                                        <!--创建状态Test1,把Border背景的颜色改成红色-->                                        <VisualState x:Name="Test1">                                            <Storyboard>                                                <ColorAnimation Storyboard.TargetName="BorderBrush" Storyboard.TargetProperty="Color" To="Red" />                                            </Storyboard>                                        </VisualState>                                        <!--创建状态Test2把Border背景的颜色改成蓝色-->                                        <VisualState x:Name="Test2">                                            <Storyboard >                                                <ColorAnimation Storyboard.TargetName="BorderBrush" Storyboard.TargetProperty="Color" To="Blue" />                                            </Storyboard>                                        </VisualState>                                    </VisualStateGroup>                                </VisualStateManager.VisualStateGroups>

然后在相关事件中使用VisualStatesManager.GoToState方法。

 

DataTemplate用于描述数据对象的视觉样式,通常需要与ControlTemplate合作来完成一些工作。要关联绑定数据对象的属性,使用Binding语法。

 

ContentControl类是内容控件的基类。内容控件都具有Content属性,如Button;

ItemsControl类是列表控件的基类。列表控件,如ListBox。

ContentControl是单项的,ItemsControl是多项的。

继承自ContentControl的控件的ControlTemplate属性,和继承自ItemsControl的控件的ItemTemplate属性,其类型都是DataTemplate。

DataTemplate经常像Style那样,作为静态资源供多个控件来使用。

ItemsControl的DataTemplate是直接投影在ItemsPresenter上的,在定义ControlTemplate时,内部的ItemsPresenter就是DataTemplate。

 

如何实现更换复杂的自定义主题?动态读取更换控件的DataTemplate就可以了。

WP8.1 UI 编程 二、样式和模板