C#/WPF

[WPF] 반사(Reflection) 애니메이션

kjun.kr 2022. 12. 13. 12:47
728x90
728x170


반사(Reflection) 애니메이션 구현 예제입니다.

<Window x:Class="Wpf.ReflectionAnimation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Wpf.ReflectionAnimation"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="370">
    <Window.Background>
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
            <LinearGradientBrush.GradientStops>
                <GradientStop Offset="0.0" Color="Black" />
                <GradientStop Offset="1.0" Color="#666666" />
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
    </Window.Background>

    <Window.Resources>
        <DrawingBrush
            x:Key="MyWireBrushResource"
            TileMode="Tile"
            Viewport="0,0,10,10"
            ViewportUnits="Absolute">
            <DrawingBrush.Drawing>
                <DrawingGroup>
                    <DrawingGroup.Children>
                        <GeometryDrawing Brush="#66CCCCFF" Geometry="M0,0 L1,0 1,0.1, 0,0.1Z" />
                        <GeometryDrawing Brush="#66CCCCFF" Geometry="M0,0 L0,1 0.1,1, 0.1,0Z" />
                    </DrawingGroup.Children>
                </DrawingGroup>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </Window.Resources>

    <StackPanel Margin="40">
        <Border
            Name="TextBorder"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Background="{StaticResource MyWireBrushResource}">
            <TextBlock
                Name="RealText"
                Margin="40"
                FontFamily="Segoe UI"
                FontSize="60 px"
                Foreground="White">
                Kjun.kr
                <TextBlock.TextEffects>

                    <!--  The TextEffect to animate.  -->
                    <TextEffect x:Name="MyTextEffect" PositionCount="1">
                        <TextEffect.Transform>
                            <TranslateTransform x:Name="TextEffectTranslateTransform" />
                        </TextEffect.Transform>
                    </TextEffect>
                </TextBlock.TextEffects>

                <TextBlock.Triggers>
                    <EventTrigger RoutedEvent="TextBlock.Loaded">
                        <BeginStoryboard>
                            <Storyboard>

                                <!--
                                    Animates the Y factor of the
                                    TextEffect's TranslateTransform.
                                -->
                                <DoubleAnimation
                                    AutoReverse="True"
                                    RepeatBehavior="Forever"
                                    Storyboard.TargetName="TextEffectTranslateTransform"
                                    Storyboard.TargetProperty="Y"
                                    From="0"
                                    To="20"
                                    Duration="00:00:0.25" />

                                <!--  Animates the position of the TextEffect.  -->
                                <Int32AnimationUsingKeyFrames
                                    AutoReverse="True"
                                    RepeatBehavior="Forever"
                                    Storyboard.TargetName="MyTextEffect"
                                    Storyboard.TargetProperty="PositionStart"
                                    Duration="0:0:6.5">
                                    <Int32AnimationUsingKeyFrames.KeyFrames>
                                        <DiscreteInt32KeyFrame KeyTime="0:0:0" Value="0" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:0.5" Value="1" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:1" Value="2" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:1.5" Value="3" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:2" Value="4" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:2.5" Value="5" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:3" Value="6" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:3.5" Value="7" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:4" Value="8" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:4.5" Value="9" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:5" Value="10" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:5.5" Value="11" />
                                        <DiscreteInt32KeyFrame KeyTime="0:0:6" Value="12" />
                                    </Int32AnimationUsingKeyFrames.KeyFrames>
                                </Int32AnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </TextBlock.Triggers>
            </TextBlock>
        </Border>

        <!--  Uses a VisualBrush to create a reflection of the animated text.  -->
        <Rectangle
            Name="ReflectedText"
            Width="{Binding ElementName=TextBorder, Path=ActualWidth}"
            Height="{Binding ElementName=TextBorder, Path=ActualHeight}"
            HorizontalAlignment="Left">
            <Rectangle.OpacityMask>
                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStop Offset="0.0" Color="#66000000" />
                        <GradientStop Offset="1.0" Color="#00000000" />
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
            </Rectangle.OpacityMask>
            <Rectangle.Fill>
                <VisualBrush Visual="{Binding ElementName=TextBorder}">
                    <VisualBrush.RelativeTransform>
                        <TransformGroup>
                            <ScaleTransform ScaleX="1" ScaleY="-1" />
                            <TranslateTransform Y="1" />
                        </TransformGroup>
                    </VisualBrush.RelativeTransform>
                </VisualBrush>
            </Rectangle.Fill>
        </Rectangle>
    </StackPanel>
</Window>

[Source]
https://github.com/kei-soft/KJunBlog/tree/master/Wpf.ReflectionAnimation

 

GitHub - kei-soft/KJunBlog

Contribute to kei-soft/KJunBlog development by creating an account on GitHub.

github.com

 

728x90
그리드형