模版

    前面介绍过,Button控件可以包含任何内容,例如简单的文本,还可以给按钮添加一个Canvas元素,Canvas元素可以包含图形。也可以给按钮添加Grid,视频。按钮还可以完成更多的操作。

    控件的外观,操作方式及其功能在WPF中是完全分离的。按钮有默认的外观,但可以用模版完全定制其外观。

    ControlTemplate模版:

      使用ControlTemplate可以指定控件的可视化结构,重新设计其外观。

    ItemPanelTemplate模版:

      对于ItemsControl,可以赋予一个ItemsPanelTemplate,以指定其项的布局。每个ItemsControl都有一个默认的ItemPanelTemplate。MenuItem使用WrapPanel,StatusBar使用DockPanel,ListBox使用VirtualizingStackPanel

    DataTemplate模版:

      DataTemplates非常适用于对象的图形化表示.给列表指定样式

    HierarchicalData模版:

      用于安排对象的树形结构。这个控件支持HeaderedItemsControl,例如TreeViewItem和MenuItem

    

    下面在Button样式中添加一个ControlTemplate模版:

    <Window.Resources>
        <Style x:Key="ButtonStyle2" TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="2*"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Rectangle Grid.RowSpan="2" RadiusX="4" RadiusY="8" Stroke="Green"
                                       Fill="{TemplateBinding Background}"/>
                            <Rectangle RadiusX="4" RadiusY="8" Margin="2">
                                <Rectangle.Fill>
                                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                        <GradientStop Offset="0" Color="LightBlue"/>
                                        <GradientStop Offset="0.5" Color="#afff"/>
                                        <GradientStop Offset="1" Color="#6faa"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <ContentPresenter Grid.RowSpan="2" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                               VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                               Margin="{TemplateBinding Padding}"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Foreground">
                                    <Setter.Value>
                                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                            <GradientStop Offset="0" Color="LightBlue"/>
                                            <GradientStop Offset="0.4" Color="Cyan"/>
                                            <GradientStop Offset="0.8" Color="LightCyan"/>         
                                        </LinearGradientBrush>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Foreground" Value="Black"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>    
    <StackPanel>
        <Button Name="button3" Background="LightBlue" Height="100" Width="220" FontSize="24"
                  Style="{StaticResource ButtonStyle2}">Template Button</Button>
    </StackPanel>

  在代码中样式中设置Setter的Property为Template模版模式,在Value中可以设置一个ControlTemplate模版。

  在ControlTemplate模版中设置两行内容, 定义了两个Rectange元素,第一个Rectange元素横跨两行, 把其Fill属性设置为{TemplateBinding Background}。标记扩展TemplateBinding允许控件模版使用模版控件中的内容。这里,举行用按钮定义的背景来填充。

  第二个矩形占据第一行,填充为渐变颜色刷

  定义第二个矩形后,使用ContentPresenter元素. 该元素默认从模版控件中提取内容,根据定义放置这些内容。如果定义了一个ContentPresenter元素,就必须用ControlTemplate设置TargetType.

  下面使用ControlTemlate定义触发器

  触发器中设置属性,和触发值

  鼠标放在按钮上,呈现效果如下:

    

posted @ 2015-12-24 21:03  幽弥狂233  阅读(270)  评论(0编辑  收藏  举报