0730-PBKDF2-HMAC-SHA1

PBKDF2-HMAC-SHA1  算法

 

 

 

https://blog.csdn.net/qq_31289187/article/details/85061439 java

 

 

1

2

3

4

5

6

<Style TargetType="TextBlock">

<Setter Property="FontSize" Value="28"/>

</Style>

<Style TargetType="{x:Type TextBlock}">

<Setter Property="FontSize" Value="28"/>

</Style>

完全没区别~~前者用了默认的隐式的方式,后者用了一个显式的命名空间引用。但其实是一样的,都是自动给TextBlock应用样式

1

2

3

<Style x:Key="{x:Type TextBlock}" TargetType="TextBlock">

   <Setter Property="FontSize" Value="28"/>

</Style>

 这种写法和上面的也完全没有区别。将 TargetType 属性设置为 TextBlock 而不为样式分配 x:Key,样式就会应用于所有 TextBlock 元素。这种情况下,x:Key 隐式设置为 {x:Type TextBlock}。 

<Style x:Key="cc" TargetType="{x:Type TextBlock}">
      <Setter Property="FontSize" Value="28"/>
</Style>

如果将 x:Key 值显式设置为 {x:Type TextBlock} 之外的任何值,如上面设置为 x:key="cc",Style 就不会自动应用于所有 TextBlock 元素。此时,必须通过使用 x:Key 值,将样式显式应用于 TextBlock 元素。

<Style x:Key="aa">
  <Setter Property="Control.FontSize" Value="28"/>
</Style>

样式位于资源部分,并且未设置样式的 TargetType 属性,则必须提供 x:Key。

除了提供 x:Key 的默认值之外,TargetType 属性还指定要应用 setter 属性的类型。如果未指定 TargetType,则必须通过语法 Property="ClassName.Property",用类名限定 Setter 对象的属性。例如,必须将 Property 设置为 "TextBlock.FontSize" 或 "Control.FontSize",而不要设置 Property="FontSize"。

 

 

TemplateBinding作为一种性能优化后的Binding使用,据说是Binding比较耗资源,这个没有求证过,但是我的程序中那么多Binding,运行起来也不觉得慢啊,或者说是用在模板中的一种Binding优化方式。既然是优化过的,那么它就会少一些东西,其中一个是数据流动的方向。TemplateBinding是单方向的,即数据源到目标的方向。这也解释了TreeViewItem官方的样式中,那个三角形的小箭头,它对于是否展开(IsExpanded属性)的属性绑定用的就不是TempalteBinding,因为他不能反过去更新数据源啊。

 

所以当数据源的类型和目标的类型不一致时,TemplateBinding需要自己写转换器来完成

总结一下TemplateBinding与Binding区别

(1)TemplateBinding只是单方向的数据绑定

(2)TemplateBinding不会自动转换数据类型

 

 

其中BorderBrush在ControlTemplate里必须要设置,也就是说在ControlTemplate 里如果设置成"BorderBrush="Red",则前端和Style里再怎么设置成其它的颜色,它都是红色;在ControlTemplate 里如果设置成BorderBrush="{TemplateBinding BorderBrush}",如果前端设置成绿色,那它不管Style里怎么设置,它都是绿色。

 

 

相同点:

1.设置UIElement元素Visibility属性为Hidden和设置其Opacity为0,都能达到隐藏元素效果。

2..两种方法隐藏元素后将同样对其子元素生效,且无法通过子元素设置Visibility为visible或Opacity为1来达到反隐藏的效果。

不同点:

3.设置为Visibility为Hidden的元素被隐藏且无法接收输入事件,而通过设置Opacity为0隐藏的元素仍可以正常接收输入事件。

题外:

4.两种方法都只是隐藏本元素及其子元素,但不影响其他元素布局,而将Visibility设置为collapsed将隐藏本元素并会对整体元素进行重新布局。
 

 

 

Storyboard:故事板

故事板是增强的时间线,可用来分组多个动画,而且具有控制动画播放的能力。暂停、停止以及改变播放位置。

下面的标记演示了如何定义用于管理DoublieAnimation

<Storyboard TargerName="cmdGrow" TargetProperty="Width">
    <DoublieAnimation From="160" TO="300" Duration="0:0:5" />
</Storyboard> 
 

TargetName和TargetProperty都是附加属性。这意味着可直接将它们应用于动画,如下所示:

<Storyboard>
    <DoubleAnimation Storyboard.TargerName="cmdGrow"  Storyboard.TargetProperty="Width" From="150" To="300" Duration="0:0:1"/>
</Storyboard> 
 

上面的语法更常用,因为通过这个语法可在同一个故事板放置几个动画,并且每个动画可以用于不同的元素和属性。

 

动画事件触发器

当创建事件触发器时,需要指定开始触发器的路由事件和由触发器执行的一个或多个动作。对于动画,最常用的动作是BeginStoryboard,该动作相当于调用BeginStoryboard()方法。

<Button Name="key1" Content="liibin"  Width="100"  Height="25">
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.MouseEnter">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation  Storyboard.TargetProperty="Width" From="150" To="300" Duration="0:0:1"/>
                        <DoubleAnimation  Storyboard.TargetProperty="Height" From="50" To="300" Duration="0:0:1"/>
                     </Storyboard>
                 </BeginStoryboard>
             </EventTrigger.Actions>
         </EventTrigger>
     </Button.Triggers>
</Button>
 

 

        <action:DataTrigger Binding="{Binding Initialized}" Value="True">
            <action:DataTrigger.Actions>
                <action:ControlStoryboardAction Storyboard="{StaticResource SwitchLogin}"></action:ControlStoryboardAction>
            </action:DataTrigger.Actions>
        </action:DataTrigger>

 

 

<Window x:Class="Wpf_2008.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window2" Height="300" Width="300" Name="win">
    <Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded" SourceName="win">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation From="1" To="100" RepeatBehavior="Forever" Duration="0:0:5" 
Storyboard.TargetName="Line1" Storyboard.TargetProperty="StrokeDashOffset"/>
                        <DoubleAnimation From="1" To="100" RepeatBehavior="Forever" Duration="0:0:5" 
Storyboard.TargetName="Line2" Storyboard.TargetProperty="StrokeDashOffset"/>
                        <DoubleAnimation From="1" To="100" RepeatBehavior="Forever" Duration="0:0:5" 
Storyboard.TargetName="Line3" Storyboard.TargetProperty="StrokeDashOffset"/>
                        <DoubleAnimation From="100" To="1" RepeatBehavior="Forever" Duration="0:0:5" 
Storyboard.TargetName="Line4" Storyboard.TargetProperty="StrokeDashOffset"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Window.Triggers>
    <Canvas Background="AliceBlue" x:Name="c" Margin="10">
       
        <Line Name="Line1" X1="0" Y1="0" X2="0" Y2="100" Stroke="Black" StrokeDashArray="2,2" StrokeThickness="4"/>
       
        <Line Name="Line2" X1="0" Y1="100" X2="100" Y2="100" Stroke="Black" StrokeDashArray="2,2" StrokeThickness="4"/>
       
        <Line Name="Line3" X1="100" Y1="100" X2="100" Y2="0" Stroke="Black" StrokeDashArray="2,2" StrokeThickness="4"/>
       
        <Line Name="Line4" X1="0" Y1="0" X2="100" Y2="0" Stroke="Black" StrokeDashArray="2,2" StrokeThickness="4"/>
       
        <Line X1="0" Y1="250" X2="100" Y2="0" Stroke="Black" StrokeDashArray="2,2" StrokeThickness="4">
            <Line.Triggers>
                <EventTrigger RoutedEvent="Line.Loaded" >
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation From="1" To="100" RepeatBehavior="Forever" Duration="0:0:5"
 Storyboard.TargetProperty="StrokeDashOffset"/>                           
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Line.Triggers>
        </Line>
    </Canvas>
</Window>

 

https://www.cnblogs.com/TianFang/p/4060397.html

与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值。 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个状态之间变化,例如,对于前面那个改变按钮宽度的例子,如果我们要实现如下效果:

  • 在2秒时将宽度从 0变为350

  • 在7秒时将宽度变为50

  • 在9秒的时候将其宽度变为200

虽然我们可以用三个From/To/By 动画组合实现类似效果,但是这样一来麻烦,二来要感知动画完成事件,不方便在XAML中使用。此时我们则可以使用关键帧动画来快速实现这一过程。

    var widthAnimation = new DoubleAnimationUsingKeyFrames();
    var keyFrames = widthAnimation.KeyFrames;

    keyFrames.Add(new LinearDoubleKeyFrame(0, TimeSpan.FromSeconds(0)));
    keyFrames.Add(new LinearDoubleKeyFrame(350, TimeSpan.FromSeconds(2)));
    keyFrames.Add(new LinearDoubleKeyFrame(50, TimeSpan.FromSeconds(7)));
    keyFrames.Add(new LinearDoubleKeyFrame(200, TimeSpan.FromSeconds(9)));

    button.BeginAnimation(WidthProperty, widthAnimation);

可以看出,关键帧动画将每一个状态制定为一个关键帧,关键帧动画时间线自动连接各个关键帧,并计算过渡状态,完成动画。因此,某种程度上,我们也可以把From/To/By 动画看成是只有两个状态的特殊关键帧动画。

 

内置的关键帧动画

与 From/To/By 动画一样,在名字空间System.Windows.Media.Animation 下也内置了大量关键帧动画,它们的命名规则是:    

    <类型> AnimationUsingKeyFrames

例如这儿使用的DoubleAnimationUsingKeyFrames,其它类型请参看MSDN:关键帧动画概述,这里就不列举了。

 

插值算法

在关键帧动画中,我们除了定义关键帧外,还需要定义两个关键帧之间的插值算法,这样系统才能根据关键帧和插值算法生成中间状态。WPF系统内置四种插值算法:

  • 线性:    两个关键帧之间均匀变化

  • 离散:    两个关键帧之间突变(到达时间点的时候硬切换,没有过渡效果)

  • 样条:    使用贝塞尔曲线实现更精确的加速和减速控制

  • 缓动:    使用缓动函数曲线实现弹性变化

综上来看,线性算法最常用,样条算法能实现精准加速和减速控制。离散的这种硬切换的效果虽然看起来没有什么动画效果,但用于连接关键帧还是比较常用的。另外在一些硬过渡的地方也是能用到的,例如实现闪烁效果。

这几种算法的具体效果这里就不做更多的介绍了,感兴趣的朋友可以看看如下两个链接中的描述和例子:

值得一提的是,并不是所有关键帧动画都支持这几种算法的,具体支持情况请参看MSDN:关键帧动画概述。 当然,对于不支持的也是可以自己手动实现的。

 

 

关键帧(IKeyFrame)

前面已经介绍过,一个关键帧主要有时间点和插值算法两部分组成,在WPF中,不同的关键帧动画对应着同的关键帧对象,它们都继承自IKeyFrame接口,其命名规则为:

    <类型> KeyFrame

例如,DoubleAnimationUsingKeyFrames对应的是DoubleKeyFrame,但由于这个类并没有制定插值算法,它只是一个抽象基类,再加上插值算法后对应的关键帧类命名规范为:

    <插值算法><类型> KeyFrame

例如,DoubleKeyFrame对应的几种插值算法的关键帧为:LinearDoubleKeyFrame、DiscreteDoubleKeyFrame、SplineDoubleKeyFrame、EasingDoubleKeyFrame。这些关键帧对象使用的方式都比较类似,这里就不多介绍了。

 

关键帧的时间点(KeyTime)

关键帧的时间点由IKeyFrame.KeyTime属性指定。它是一个KeyTime类型,它有如下几种取值类型:

  • 时间点TimeSpan: 靠TimeSpan直接决定时间点,可以通过函数KeyTime.FromTimeSpan()创建,也可以直接用TimeSpan隐式转换。

  • 相对时间Percent:  指定的是百分比,通过时间线的Duration来联合决定对应的时间点。通过函数KeyTime.FromPercent()创建。

  • 特殊值Uniform:    时间线平均分布每个关键帧所需要的时间。通过函数KeyTime.Uniform创建。

  • 特殊值Paced:      间线按固定的帧率分配所需时间,这种情况下,变化大的关键帧分配时间长,变化小的关键帧分配时间段。通过函数KeyTime.Paced创建。

用代码创建的方式这儿就不举例了,这里就仅仅列举一下如何在XAML中表示这几种时间:

    <LinearDoubleKeyFrame Value="100" KeyTime="0:0:3" />
    <LinearDoubleKeyFrame Value="100" KeyTime="30%" />
    <LinearDoubleKeyFrame Value="100" KeyTime="Uniform" />
    <LinearDoubleKeyFrame Value="100" KeyTime="Paced" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值