WPF 模板

模板

模板允许你用空想出来的任何东西完全替换一个元素的可视树,但其他功能不受影响。

WPF中模板类型:

DataTemplate模板

ItemsPanelTemplate模板

ControlTemplate模板(此处介绍)

<StackPanel>
    <StackPanel.Resources>
        <!-- 自定义模板,指定模板使用类型:按钮 -->
        <ControlTemplate x:Key="buttonTemplate" TargetType="Button">
            <Grid>
                <!-- 画圆,名称:outerCircle -->
                <Ellipse x:Name="outerCircle">
                    <Ellipse.Fill>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                            <!-- 动态指定背景色 -->
                            <GradientStop Offset="0" 
                                Color="{Binding RelativeSource={RelativeSource TemplatedParent},
                                Path=Background.Color}"/>
                            <GradientStop Offset="1" Color="Red"/>
                        </LinearGradientBrush>
                    </Ellipse.Fill>
                </Ellipse>
                <Ellipse RenderTransformOrigin=".5,.5">
                    <Ellipse.RenderTransform>
                        <ScaleTransform ScaleX=".8" ScaleY=".8"/>
                    </Ellipse.RenderTransform>
                    <Ellipse.Fill>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                            <GradientStop Offset="0" Color="White"/>
                            <GradientStop Offset="1" Color="Transparent"/>
                        </LinearGradientBrush>
                    </Ellipse.Fill>
                </Ellipse>
                <!-- 动态绑定到按钮的Content值(Content值可为文本,图片对象) -->
                <Viewbox>
                    <!-- 使用ContentPresenter更轻量 -->
                    <ContentPresenter Margin="{TemplateBinding Button.Padding}"
                                      Content="{TemplateBinding Button.Content}"/>
                </Viewbox>
            </Grid>
                
            <!-- 定义触发器,设置当鼠标移上时按钮显示样式 -->
            <ControlTemplate.Triggers>
                <Trigger Property="Button.IsMouseOver" Value="True">
                    <!-- 通过绑定按钮BorderBrush属性,指定按钮背景笔刷 -->
                    <Setter TargetName="outerCircle" Property="Fill" 
                            Value="{Binding RelativeSource={RelativeSource TemplatedParent},
                            Path=BorderBrush}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </StackPanel.Resources>

    <!-- 使用模板 -->
    <Button Template="{StaticResource buttonTemplate}" Height="100" Width="100" 
            Padding="20" Background="GreenYellow" FontSize="100" BorderBrush="Pink">Ok</Button>
    <Button Template="{StaticResource buttonTemplate}" Height="150" Width="150" 
            Padding="10" Background="LightPink" BorderBrush="Orange">
        <Image Source="img/sign.gif"></Image>
    </Button>
</StackPanel>


将模板与样式混合起来

优点:

1.可将模板和任意属性设置组合

2.带来默认模板的效果

3.允许提供默认但可重载的属性值

<StackPanel.Resources>
    <!-- 模板与样式混合使用 -->
    <Style x:Key="ButtonStyle" TargetType="Button">
        <!-- 指定默认背景色笔刷 -->
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                    <GradientStop Offset="0" Color="Beige"/>
                    <GradientStop Offset="1" Color="DarkBlue"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <!-- 定义模板 -->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <!-- 动态绑定背景色笔刷 -->
                    <StackPanel Background="{TemplateBinding Background}" 
                         Width="100" Height="50" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>          
</StackPanel.Resources>

<!-- 使用默认渐变笔刷填充 -->
<Button Style="{StaticResource ButtonStyle}" />
<!-- 指定自定义背景色 -->
<Button Style="{StaticResource ButtonStyle}" Background="Bisque" /></pre>


 

你可能感兴趣的:(Path,button,WPF,setter,binding,DataTemplate)