WPF教程(九)样式入门二

在我看来,WPF的Trigger是一个非常聪明的设计,Winform要大量的代码才绘出的皮肤,在这里轻松就能搞定。但我也不是鄙视Winform,它也有自己的优势,抛开界面美化,在一些控件的使用上,明显比WPF好用,就拿DateTimePicker控件,一个能具体到小时,一个只有日期。我坚信存在即合理,各有用处。

言归正传,触发器,是System.Windows.TriggerBase的派生类的实例,可以根据属性或事件发生变化时进行响应,并自动调整样式。触发器在Style的 Triggers集合中定义,每个样式都可以有任意多个触发器。

PropertyTrigger,属性触发器是在当某个依赖属性的值发生变化时触发执行一个Setter的集合,当属性失去这个值时,这些被处罚执行的Setter集合会自动被撤销。

<StackPanel>  
    <Button Content="TriggerBtn" Click="Trigger_Click">
        <Button.Resources >
            <Style TargetType="Button">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="RenderTransform">
                        <Setter.Value>
                            <!-->旋转角度<-->
                            <RotateTransform Angle="10"></RotateTransform>
                            </Setter.Value>
                        </Setter>
                            <!-->原点比例位置<-->
                        <Setter Property="RenderTransformOrigin" Value="0.5,0.5"></Setter>
                    <Setter Property="Background" Value="#FF0CC030" />
                </Trigger>
            </Style.Triggers>
            </Style>
        </Button.Resources>
    </Button>
</StackPanel>

MultiPropertyTTrigger ,多条件属性触发器是在满足多个依赖属性的值发生变化时触发执行一个Setter的集合,当属性失去这个值时,这些被处罚执行的Setter集合会自动被撤销。

<StackPanel>
    <Button Content="TriggerBtn" Click="Trigger_Click" >
        <Button.Resources >
             <Style TargetType="Button">
                 <Style.Triggers>
                     <MultiTrigger>
                          <MultiTrigger.Conditions>
                               <Condition Property="IsMouseOver" Value="True"/>
                               <Condition Property="IsPressed" Value="True"/>
                          </MultiTrigger.Conditions>
                          <Setter Property="RenderTransform">
                               <Setter.Value>
                               <!-->旋转角度<-->
                                   <RotateTransform Angle="10"/>
                               </Setter.Value>
                          </Setter>
                          <!-->原点比例位置<-->
                          <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
                          <Setter Property="Background" Value="#FF0CC030" />
                     </MultiTrigger>
                 </Style.Triggers>
             </Style>
        </Button.Resources>
    </Button>
</StackPanel>

DataTrigger,数据触发器和属性触发器除了面对的对象类型不一样外其它完全相同。数据触发器是来检测非依赖属性(也就是用户自定义的.NET属性)值发生变化时来触发并调用符合条件的一系列Setter集合,看下面两个例子:

1.点击Button改变文本颜色

<Window.Resources>      
    <Style x:Key="styData" TargetType="{x:Type Label}">
        <Style.Triggers>
            <DataTrigger  Binding="{Binding Path=Text}" Value="Hello World">
                <!--如果后台类的属性Text等于Hello World时,就会触发属性,将字体颜色改变红色-->
                <Setter Property="Foreground" Value="Red"></Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <Grid Background="Bisque">
        <Label Content="name:lbl" Height="37" HorizontalAlignment="Left" Margin="224,110,0,0" Name="lbl" VerticalAlignment="Top" Width="auto" Style="{StaticResource styData}" />
        <Button Content="点击变色" Height="auto" HorizontalAlignment="Left" Margin="224,204,0,0" Name="btnPrint" VerticalAlignment="Top" Width="auto" Click="btnPrint_Click" />
    </Grid>  
</Grid>
class changetext
{
    public string _text;
    public string Text
    {
        get { return _text; }
        set { _text = value; }
    }
}
public partial class MainWindow : Window
{

    changetext st = new changetext();
    public MainWindow()
    {
        InitializeComponent();

    }
    private void btnPrint_Click(object sender, RoutedEventArgs e)
    {
        st.Text = "Hello World";
        lbl.DataContext = st;
    }
}

2. ListBox的内容不同颜色显示

<Window.Resources>
    <Style TargetType="ListBoxItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=Publisher}" Value="Wrox Press">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=Publisher}" Value="Dummies">
                <Setter Property="Background" Value="Yellow"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=Publisher}" Value="Sybex">
                <Setter Property="Background" Value="LightBlue"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <ListBox x:Name="list1" Width="300" Height="200" Margin="12,87,191,24" Grid.Row="0" />
</Grid>
class Book
{
    public string Title { get; set; }    //书名
    public string Publisher { get; set; }   //出版商
    public override string ToString()//不可能显示一个对象,系统会调用对象的ToString()来显示
    {
        return Title;
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        list1.Items.Add(new Book
        {
            Title = "Professional C# 4.0",
            Publisher = "Wrox Press"
        });
        list1.Items.Add(new Book
        {
            Title = "C# 2008 for Dummies",
            Publisher = "Dummies"
        });
        list1.Items.Add(new Book
        {
            Title = "Mastering Integrated HTML and CSS",
            Publisher = "Sybex"
        }); 
    }
}

MultiDataTrigger,在绑定数据满足一组条件时一项或多项属性值执行操作,我们将上述例2的资源样式改成MultiDataTrigger,明显不是全部都能触发。

<Window.Resources>
    <Style TargetType="ListBoxItem">
        <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition  Binding="{Binding Path=Publisher}" Value="Wrox Press"/>
                <Condition  Binding="{Binding Path=Publisher}" Value="Dummies"/>                      
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Red"/>              
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=Publisher}" Value="Dummies"/>
                <Condition Binding="{Binding Path=Publisher}" Value="Sybex"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Yellow"/>
        </MultiDataTrigger>            
        <DataTrigger Binding="{Binding Path=Publisher}" Value="Sybex">
            <Setter Property="Background" Value="LightBlue"/>
        </DataTrigger>
    </Style.Triggers>
    </Style>
</Window.Resources>

EventTrigger,在事件发生时激活,即触发路由事件时会被调用。

<StackPanel>
    <Button Content="TriggerBtn">
        <Button.Resources>
            <Style TargetType="{x:Type Button}">
                <Style.Triggers>
                    <EventTrigger RoutedEvent="Mouse.MouseEnter" >
                        <BeginStoryboard>
                            <!--一个为其所包含的动画提供目标信息的容器。除非动画放在Storyboard中,负责不能在XMAL中被实例化-->
                            <Storyboard>
                                 <DoubleAnimation Duration="00:00:10" Storyboard.TargetProperty="FontSize"  To="18" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="Mouse.MouseLeave">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <Storyboard>
                                     <DoubleAnimation Duration="00:00:10" Storyboard.TargetProperty="FontSize"  To="12" />
                                 </Storyboard>
                             </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </Button.Resources>
    </Button>
</StackPanel>

 

目录 WPF体系结构 .......................................................................................................................................................... 3 WPF应用程序管理 .................................................................................................................................................. 5 一、WPF应用程序由System.Windows.Application 类进行管理 ................................................................. 5 、创建WPF应用程序 ................................................................................................................................. 5 三、应用程序关闭 ........................................................................................................................................... 6 四、Application 对象的事件 ........................................................................................................................... 7 五、WPF应用程序生存周期 .......................................................................................................................... 9 WPF窗体 ................................................................................................................................................................ 10 一、窗体类 ..................................................................................................................................................... 10 1、XAML文件....................................................................................................................................... 10 2、后台代码文件 ................................................................................................................................... 10 、窗体的生存周期 ......................................................................................................................................11 1、显示窗体 ............................................................................................................................................11 2、关闭窗体 ........................................................................................................................................... 12 3、窗体的激活 ....................................................................................................................................... 12 4、窗体的生存周期 ............................................................................................................................... 12 三、其他窗体相关的属性、方法、事件 ..................................................................................................... 15 四、定义异形窗体 ......................................................................................................................................... 16 StackPanel、WrapPanel、DockPanel 容器 .......................................................................................................... 19 一、StackPanel ............................................................................................................................................... 19 1、可以使用Orientation 属性更改堆叠的顺序 ................................................................................... 19 2、设置控件的属性,调整控件的显示................................................................................................ 20 、WrapPanel ................................................................................................................................................ 20 三、DockPanel ................................................................................................................................................ 21 Grid UniformGrid 容器 ........................................................................................................................................ 22 一、Grid .......................................................................................................................................................... 22 、使用GridSplit分割 ................................................................................................................................ 23 三、UniformGrid ............................................................................................................................................ 25 Canvas、InkCanvas布局 ....................................................................................................................................... 27 一、Canvas ..................................................................................................................................................... 27 、InkCanvas ................................................................................................................................................ 27 WPF对控件其类型的继承方式如下 .................................................................................................................... 29 WPF控件内容模型 ................................................................................................................................................ 32 一、ContentControl模型 ............................................................................................................................... 35 、HeaderedContentControl模型 ................................................................................................................ 36 三、ItemsControl模型 ................................................................................................................................... 38 1、使用ItemSource 属性 ....................................................................................................................... 38 2、使用Items属性 ................................................................................................................................ 40 四、HeaderedItemsControl模型 .................................................................................................................... 42 Panel Decorator TextBlock 内容模型 .................................................................................................................. 44 一、Panel内容模型 ....................................................................................................................................... 44 本文来自网络,由大胡子制作.版权归原作者所有.如果你有 wpf 的好资料可以联系我 QQ:249872349,Email:BigBeard@126.com 、Decorator内容模型 ................................................................................................................................ 45 三、TextBlock 模型 ........................................................................................................................................ 46 四、TextBox 模型 ........................................................................................................................................... 49 依赖项属性和路由事件 ......................................................................................................................................... 50 一、依赖项属性(Dependency Property ....................................................................................................... 50 1、依赖项属性与CLR 包装属性 ......................................................................................................... 50 2、使用由依赖项属性提供的属性功能................................................................................................ 51 3、自定义依赖项属性及重写依赖项属性 ............................................................................................ 52 、路由事件(RoutedEvent)..................................................................................................................... 53 键盘输入、鼠标输入、焦点处理 ......................................................................................................................... 56 一、键盘类和键盘事件 ................................................................................................................................. 56 、鼠标类和鼠标事件 ................................................................................................................................. 57 三、焦点处理 ................................................................................................................................................. 60 1、键盘焦点: ....................................................................................................................................... 60 2、逻辑焦点 ........................................................................................................................................... 61 3、键盘导航 ........................................................................................................................................... 61 4、焦点事件 ........................................................................................................................................... 61 WPF命令 ................................................................................................................................................................ 63 一、命令: ..................................................................................................................................................... 64 、命令源 ..................................................................................................................................................... 65 三、命令目标 ................................................................................................................................................. 66 四、命令绑定 ................................................................................................................................................. 67 WPF资源 ................................................................................................................................................................ 70 一、什么是资源 ............................................................................................................................................. 70 、资源的定义及XAML中引用 ................................................................................................................ 70 三、XAML解析资源的顺序 ......................................................................................................................... 74 四、静态资源(StaticResource)和动态资源(DynamicResource) ........................................................ 77 五、不同类型的资源 ..................................................................................................................................... 81 1、程序集资源。 ................................................................................................................................... 81 2、对象资源 ........................................................................................................................................... 82
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值