样式触发器和控件模板

样式触发器不想Setter一开始就使用定义好的样式。Style类提供了Triggers集合,每个样式可以有多个触发器,每个触发器是一个派生自System.Windows.TriggerBase类的实例。在WPF中,派生自TriggerBase的触发器有如下几种类型。

  • Trigger:最简单的触发器,该触发器检查特定的依赖属性的值是否发生变化来使用Setter改变样式。
  • MultiTrigger:组合了多个条件,所有的条件必须被满足才能改变。
  • DataTrigger:该触发器与数据绑定在一起运行。但是该触发器是检测任何绑定的数据是否发生变化。
  • MultiDataTrigger:组合了多个dataTrigger。
  • EventTrigger:最常用的触发器,当某个事件触发时改变样式。
    创建简单触发器
    它监测依赖属性的改变而改变样式。例下:通过检测鼠标是否位于指定的按钮上来触发样式的变更。
   <Window.Resources>
<Style.Triggers>
                <Trigger Property="Control.IsMouseOver" Value="true">
                    <!--  当鼠标移过按钮时,触发样式变更-->
                    <Setter Property="Control.FontStyle" Value="Italic"/>
                    <Setter Property="Control.Background" Value="Blue"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Content="Button1" HorizontalAlignment="Left" Margin="231,179,0,0" VerticalAlignment="Top" Width="75" Style="{StaticResource MouseIsOver}"/>
        <Button Content="Button2" HorizontalAlignment="Left" Margin="231,240,0,0" VerticalAlignment="Top" Width="75" Style="{StaticResource MouseIsOver}"/>
        </Grid>

也可以在一个样式中使用多个触发器应用到同一个元素。

         <Window.Resources>
        <Style x:Key="MouseIsOver">
            <!--  定义基本样式 -->
            <Setter Property="Control.FontSize" Value="11"></Setter>
            <Setter Property="Control.Margin" Value="11"></Setter>
            <!-- 定义简单触发器  -->
            <Style.Triggers>
                <Trigger Property="Control.IsMouseOver" Value="true">
                    <!--  当鼠标移过按钮时,触发样式变更-->
                    <Setter Property="Control.FontStyle" Value="Italic"/>
                    <Setter Property="Control.Background" Value="Blue"/>
                </Trigger>
                <!-- 当按钮按下时,变更按钮的颜色和字体  -->
                <Trigger Property="Button.IsPressed" Value="true">
                    <Setter Property="Control.FontStyle" Value="Normal"/>
                    <Setter Property="Control.Background"  Value="Yellow"/>
                 </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

如果多个触发器修改相同的属性,则最后触发的触发器具有优先权。

控件模板
WPF提出了控件模板的特性,使开发人员可以完全重新定义控件的外观。在WPF中,每个控件都有一个默认的控件模板,用于定义控件的基本外观和行为。WPF使用ControlTemplate定义控件的外观,每个控件都有一个Template属性。分为以下3类:
ControlTemplate,有2个属性TargetType用来指定模板的控件类型,Trigger则指定模板的触发器集合。
DataTemplate
ItemsPanelTemplate
创建控件模板的目地基本是为了重用,所以一般定义到资源中,然后使用StaticResource进行引用。
例如:

 <Window.Resources>
 <Style x:Key="MouseIsOver">
            <!--  定义基本样式 -->
            <Setter Property="Control.FontSize" Value="11"></Setter>
            <Setter Property="Control.Margin" Value="11"></Setter>
            <!-- 定义简单触发器  -->
            <Style.Triggers>
                <Trigger Property="Control.IsMouseOver" Value="true">
                    <!--  当鼠标移过按钮时,触发样式变更-->
                    <Setter Property="Control.FontStyle" Value="Italic"/>
                    <Setter Property="Control.Background" Value="Blue"/>
                </Trigger>
                <!-- 当按钮按下时,变更按钮的颜色和字体  -->
                <Trigger Property="Button.IsPressed" Value="true">
                    <Setter Property="Control.FontStyle" Value="Normal"/>
                    <Setter Property="Control.Background"  Value="Yellow"/>
                 </Trigger>
            </Style.Triggers>
        </Style>
        <ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
            <Border BorderBrush="Orange" BorderThickness="3" CornerRadius="2" Background="Red" TextBlock.Foreground="White" Margin="2">
                <!-- 使用ContentPresenter指定内容属性 -->
                <ContentPresenter RecognizesAccessKey="True" HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
            </Border>
        </ControlTemplate>
 </Window.Resources>
  <Button Content="Button1" HorizontalAlignment="Left" Margin="231,179,0,0" VerticalAlignment="Top" Width="75" Style="{StaticResource MouseIsOver}" Template="{StaticResource ButtonTemplate}"/>

效果:在这里插入图片描述
模板触发器
上述代码中有模板触发器的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值