• WPF中的Style


    一、Style基础知识

    构成Style最重要的两种元素是Setter和Trigger

      Setter类帮助我们设置控件的静态外观风格

      Trigger类帮助我们设置控件的行为风格

    Setter类的Property属性是用来指明你想为目标的哪个属性赋值;Value属性则是你提供的属性值:例如在Window的资源词典中放置一个针对TextBlock的Style,Style中使用若干          Setter来设定TextBlock的一些属性,这样程序中的TextBlock就会具有统一的风格,除非使用{x:Null}显示地清空Style.

    Trigger类最基本的是触发器,Property是Trigger关键的属性名称,Value是触发条件,Trigger类还有一个Setters属性,此属性是一组Setter,一旦触发条件被满足,这组Setter           的“属性-值”就会被应用,触发条件不再满足后,各属性值会被还原。

    二、案例

    1、  Style中的Setter

    <Window x:Class="Style中的Setter.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="TextBlock">
                <Style.Setters>
                    <Setter Property="FontSize" Value="24"/>
                    <Setter Property="TextDecorations" Value="Underline"/>
                    <Setter Property="FontStyle" Value="Italic"/>
                </Style.Setters>
            </Style>
        </Window.Resources>
        <StackPanel Margin="5">
            <TextBlock Text="Hello Wpf"/>
            <TextBlock Text="This is a sample"/>
            <TextBlock Text="by time 2009" Style="{x:Null}"></TextBlock>
        </StackPanel>
    </Window>

    Style中的Trigger

    <Window x:Class="Style中的Trigger.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="CheckBox" x:Key="myStyle">
                <Style.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="FontSize" Value="20"/>
                        <Setter Property="Foreground" Value="Orange"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
        <StackPanel>
            <CheckBox Content="悄悄地我走了" Margin="5" Style="{StaticResource myStyle}"/>
            <CheckBox Content="正如我轻轻的来" Margin="5"/>
            <CheckBox Content="我挥一挥衣袖" Margin="5"/>
            <CheckBox Content="不带走一片云彩" Margin="5"/>
        </StackPanel>
    </Window>

    如果想全部应用的话那就去掉x:Key="myStyle"

    2、MultiTrigger:(叫MultiConditionTrigger更合适)因为必须多个条件同时满足的时候才会被触发,MultiTrigger比Trigger多了一个Conditions属性,需要同时成立的条件就被存储在这个集合中。

        <Window.Resources>
            <Style TargetType="CheckBox">
                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsChecked" Value="True"/>
                            <Condition Property="Content" Value="正如我轻轻的来"/>
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="FontSize" Value="20"/>
                            <Setter Property="Foreground" Value="Orange"/>
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
        <StackPanel>
            <CheckBox Content="轻轻的我走了"/>
            <CheckBox Content="正如我轻轻的来"/>
            <CheckBox Content="我轻轻的招手"/>
            <CheckBox Content="不带走一片云彩"/>
        </StackPanel>

    3、由数据触发的DataTrigger

        <Window.Resources>
            <local:L2BConverter x:Key="cvtr"/>
            <Style TargetType="TextBox">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Text.Length,Converter={StaticResource cvtr}}" Value="false">
                        <Setter Property="BorderBrush" Value="Red"/>
                        <Setter Property="BorderThickness" Value="11"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
        <StackPanel>
            <TextBox Margin="5"/>
            <TextBox Margin="5"/>
            <TextBox Margin="5"/>
        </StackPanel>
        class L2BConverter:IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                int textLength = (int) value;
                return textLength > 6 ? true : false;
            }
    
            public object ConvertBack(object value, Type targerType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

    4、多数据条件触发的MultiDataTrigger:有时我们会遇到要求多个数据同时满足时才能触发变化的需求,此时可以考虑使用MultiDataTrigger

     

    <Window x:Class="多数据条件触发的MultiDataTrigger.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:多数据条件触发的MultiDataTrigger"
            xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="ListBoxItem">
                <!--使用Style设置DataTemplate-->
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding ID}"/>
                                <TextBlock Text="{Binding Name}"/>
                                <TextBlock Text="{Binding Age}"/>
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
                <!--MultiDataTrigger-->
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Path=ID}" Value="2"/>
                            <Condition Binding="{Binding Path=Name}" Value="Tom"/>
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter Property="Background" Value="Orange"/>
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
            <!--数据源-->
            <!--<collections:ArrayList x:Key="stuList">
                <local:Student ID="1" Name="One" Age="1"/>
                <local:Student ID="2" Name="Two" Age="2"/>
                <local:Student ID="3" Name="Three" Age="3"/>
            </collections:ArrayList>-->
        </Window.Resources>
        <StackPanel>
            <ListBox x:Name="list" Margin="5" />
        </StackPanel>
    </Window>
                List<Student> stuList=new List<Student>()
                    {
                        new Student(){ID = 1,Name = "One",Age = 1},
                        new Student(){ID = 2,Name = "Two",Age = 2},
                        new Student(){ID = 3,Name = "Three",Age = 3},
                        new Student(){ID = 2,Name = "Tom",Age = 4}
                    };
                this.list.ItemsSource = stuList;
            }

    5、由事件触发的EventTrigger

    EventTrigger是触发器中最特殊的一个。首先,它不是由属性值或数据的变化来触发而是由事件来触发;其次,被触发后它并非应用一组Setter,而是执行一段动画。

    <Window x:Class="由事件触发的EventTrigger.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="Button">
                <Style.Triggers>
                    <!--鼠标进入-->
                    <EventTrigger RoutedEvent="MouseEnter">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation To="150" Duration="0:0:0.2" Storyboard.TargetProperty="Width"/>
                                <DoubleAnimation To="150" Duration="0:0:0.2" Storyboard.TargetProperty="Height"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <!--鼠标退出-->
                    <EventTrigger RoutedEvent="MouseLeave">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="Width"/>
                                <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="Height"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
        <Grid>
            <Button Width="40" Height="40"></Button>
        </Grid>
    </Window>
  • 相关阅读:
    矩阵快速幂 HDU3483
    欧拉函数 求小于某个数并与其互质的数的个数
    扩展欧几里德算法求逆元3
    拓展欧几里德算法求逆元2
    【20140113-2】MyEclipse生成javadoc时出错:编码GBK的不可映射字符
    【131202】SQL
    【20140113】package 与 import
    系统架构等级
    ora-01658 :无法为表空间USERS 中的段创建INITIAL区
    WMSYS.WM_CONCAT 函數的用法
  • 原文地址:https://www.cnblogs.com/chenyongblog/p/3573949.html
Copyright © 2020-2023  润新知