zoukankan      html  css  js  c++  java
  • 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

      在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。很希望能够分享给大家。

      本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。

      在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。

      前文可以翻阅本博客wpf标签的文章。

      [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂cnblogs.com/xfuture]


      

      #63 Trigger触发后的属性改变可以自动重置

      当Trigger改变了一个属性的值后,如果Trigger中的判断不再为true的时候,该属性会自动重置为初始值。

      例子:对一个button mouse over的时候你设置其有dropshadoweffect,而当你离开该button的时候就会回复其原始状态。

    <Window.Resources>
        <Style x:Key="hoverStyle" TargetType="Button">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Button.Effect">
                        <Setter.Value>
                            <DropShadowEffect/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <Button Content="Run" Height="23" Width="75" Style="{StaticResource hoverStyle}"/>
        <Button Content="Skip" Height="23" Width="75" Style="{StaticResource hoverStyle}"/>
        <Button Content="Jump" Height="23" Width="75" Style="{StaticResource hoverStyle}"/>
    </StackPanel>

      

      #64 Wpf所支持的三种Triggers

      Wpf支持三种不同种类的Triggers:

      <1>. Property trigger,

      1. 当依赖属性改变时触发,

      2. 使用属性名字来定制,

      3. 包含Setter元素,来赋予一个或者多个依赖属性触发器,当Trigger处于active状态或者处于inactive状态时,可以触发一个或者多个TriggerAction.

       

      <2>. Data trigger,

      1. 当CLR属性改变时触发,

      2. 使用Binding 关键字来定制,

      3. 包含Setter元素,来赋予一个或者多个依赖属性触发器,当Trigger处于active状态或者处于inactive状态时,可以触发一个或者多个TriggerAction.

      <3>. Event trigger,

      1. 当一个Routed event触发时触发,

      2. 可以触发派生自TriggerAction的类,比如BeginStoryboard, SoundPlayerAction.

      3. 多用在WPF 动画上

      #65 依赖属性继承逻辑树上层元素赋予的值

      依赖属性的值可以来自很多不同的数据源,但是一般来说都会从逻辑树上层元素继承值。

      这意味着当你在Xaml中高层元素赋予一个依赖属性值,其子元素相同名字的依赖属性会继承其值。

      下面是一个在window元素中定义fontstyle而子元素继承到的例子:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:m="clr-namespace:PersonLib;assembly=PersonLib"
            Title="MainWindow" Height="350" Width="525" FontStyle="Italic">
        <StackPanel Orientation="Vertical">
            <Button Content="Run" Height="23" Width="75" />
            <Button Content="Skip" Height="23" Width="75" />
            <StackPanel Orientation="Horizontal">
                <Label Content="Inside 2nd StackPanel"/>
                <Label Content="I do my own FontStyle" FontStyle="Normal"/>
            </StackPanel>
        </StackPanel>
    </Window>

      子元素中的Label会继承window定义的Italic的字体。

      #66 依赖属性冒泡寻找其继承值

      一个UI元素会向上寻找其需要继承的值,除非寻找到独特定义的属性则会一直向上冒泡寻找到根元素。

      下面有个button中寻找fontstyle属性值的例子,穿过了stackpanel和grid一直到window找到其定义值。

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:m="clr-namespace:PersonLib;assembly=PersonLib"
            Title="MainWindow" Height="350" Width="525" FontStyle="Italic">
    <Grid>
        <StackPanel Orientation="Vertical">
            <Button Content="Run" Height="23" Width="75" />
            <Button Content="Skip" Height="23" Width="75" />
        </StackPanel>
    </Grid>
    </Window>

      #67 UI元素控件的类继承图

      

      #68 WPF UI元素的四个基础类

      存在四个基础类,大多数UI元素继承自它们,或者你自己定制一些类的时候也是继承自它们。

      1. ContentElement, 2. FrameworkContentElement, 3. UIElement, 4. FrameworkElement.

      

      下一期会有更多关于WPF内置结构的Tips,希望能多多关注~

  • 相关阅读:
    2 java开发环境的配置步骤
    1 java 笔记
    sql 创建新表时的完成格式
    sql 将英文句子中的单词首字母转换为大写
    c# datatable 如何转CSV文件
    c#调用存储过程实现批量增加和修改数据
    c#如何使用MemoryStream和BinaryFormatter进行对象的序列化和返序列化
    supersr--KVO/KVC
    supersr--控制器的生命周期:
    Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型
  • 原文地址:https://www.cnblogs.com/xfuture/p/4024409.html
Copyright © 2011-2022 走看看