728x90
반응형
728x170
▶ MainWindow.xaml
<Window x:Class="TestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800"
Height="600"
Title="이미지 뒤집기"
FontFamily="나눔고딕코딩"
FontSize="16">
<Window.Resources>
<Storyboard x:Key="TopStoryboardKey"
FillBehavior="Stop">
<DoubleAnimation
Storyboard.TargetName="targetTopSkewTransform"
Storyboard.TargetProperty="(SkewTransform.AngleX)"
Duration="0:0:0.1"
From="0"
To="-10" />
<DoubleAnimation
Storyboard.TargetName="targetTopScaleTransform"
Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
Duration="0:0:0.25"
From="1"
To="0" />
</Storyboard>
<Storyboard x:Key="BottomStoryboardKey"
FillBehavior="Stop">
<DoubleAnimation
Storyboard.TargetName="targetBottomSkewTransform"
Storyboard.TargetProperty="(SkewTransform.AngleX)"
BeginTime="0:0:0.25"
Duration="0:0:0.25"
From="10"
To="0" />
<DoubleAnimation
Storyboard.TargetName="targetBottomSkewTransform"
Storyboard.TargetProperty="(SkewTransform.AngleX)"
BeginTime="0:0:0.5"
Duration="0:0:0.1"
AutoReverse="True"
From="0"
To="5" />
<DoubleAnimation
Storyboard.TargetName="targetBottomScaleTransform"
Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
BeginTime="0:0:0.25"
Duration="0:0:0.25"
From="0"
To="1" />
<DoubleAnimation
Storyboard.TargetName="targetBottomScaleTransform"
Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
BeginTime="0:0:0.5"
Duration="0:0:0.1"
AutoReverse="True"
From="1"
To="0.9" />
</Storyboard>
<ImageBrush x:Key="TopBrushKey" Viewbox="0 0 1 0.5" />
<ImageBrush x:Key="BottomBrushKey" Viewbox="0 0.5 1 0.5" />
</Window.Resources>
<Grid
Width="640"
Height="480"
Margin="10"
Background="RoyalBlue">
<Rectangle x:Name="sourceTopRectangle"
Height="240"
VerticalAlignment="Top"
Fill="{StaticResource TopBrushKey}" />
<Rectangle x:Name="sourceBottomRectangle"
Height="240"
VerticalAlignment="Bottom"
Fill="{StaticResource BottomBrushKey}" />
<Rectangle x:Name="targetTopRectangle"
Height="240"
VerticalAlignment="Top"
Fill="{StaticResource TopBrushKey}"
RenderTransformOrigin="0.5,1">
<Rectangle.RenderTransform>
<TransformGroup>
<SkewTransform x:Name="targetTopSkewTransform" AngleX="0" />
<ScaleTransform x:Name="targetTopScaleTransform" ScaleY="1" />
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle x:Name="targetBottomRectangle"
Height="240"
Fill="{StaticResource BottomBrushKey}"
VerticalAlignment="Bottom"
RenderTransformOrigin="0 0">
<Rectangle.RenderTransform>
<TransformGroup>
<SkewTransform x:Name="targetBottomSkewTransform" AngleX="0" />
<ScaleTransform x:Name="targetBottomScaleTransform" ScaleY="1" />
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
<StackPanel
Margin="20"
Height="30"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Width" Value="25" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Opacity" Value="0.5" />
<Setter Property="FontFamily" Value="Verdata" />
<Setter Property="FontSize" Value="30" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="FontStyle" Value="Italic" />
<Setter Property="Foreground" Value="White" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="1" />
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock x:Name="textBlock1" Text="1" />
<TextBlock x:Name="textBlock2" Text="2" />
<TextBlock x:Name="textBlock3" Text="3" />
<TextBlock x:Name="textBlock4" Text="4" />
</StackPanel>
</Grid>
</Window>
728x90
▶ MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
namespace TestProject
{
/// <summary>
/// 메윈 윈도우
/// </summary>
public partial class MainWindow : Window
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary>
/// 테스트 윈도우
/// </summary>
public MainWindow()
{
InitializeComponent();
this.sourceTopRectangle.Fill = (Resources["TopBrushKey" ] as ImageBrush).Clone();
this.sourceBottomRectangle.Fill = (Resources["BottomBrushKey"] as ImageBrush).Clone();
this.targetTopRectangle.Fill = (Resources["TopBrushKey" ] as ImageBrush).Clone();
this.targetBottomRectangle.Fill = (Resources["BottomBrushKey"] as ImageBrush).Clone();
(Resources["TopStoryboardKey" ] as Storyboard).Completed += topStoryboard_Completed;
(Resources["BottomStoryboardKey"] as Storyboard).Completed += bottomStoryboard_Completed;
this.textBlock1.MouseDown += textBlock_MouseDown;
this.textBlock2.MouseDown += textBlock_MouseDown;
this.textBlock3.MouseDown += textBlock_MouseDown;
this.textBlock4.MouseDown += textBlock_MouseDown;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 텍스트 블럭 마우스 하강시 처리하기 - textBlock_MouseDown(sender, e)
/// <summary>
/// 텍스트 블럭 마우스 하강시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void textBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
TextBlock textBlock = sender as TextBlock;
ChangeTarget("pack://Application:,,,/" + textBlock.Text + ".png");
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 타겟 변경하기 - ChangeTarget(resourceURI)
/// <summary>
/// 타겟 변경하기
/// </summary>
/// <param name="resourceURI">리소스 URI</param>
private void ChangeTarget(string resourceURI)
{
ImageSource sourceImageSource = (targetTopRectangle.Fill as ImageBrush).ImageSource as ImageSource;
ImageSource targetImageSource = new BitmapImage(new Uri(resourceURI));
this.targetBottomScaleTransform.ScaleY = 0;
(this.sourceTopRectangle.Fill as ImageBrush).ImageSource = targetImageSource;
(this.targetTopRectangle.Fill as ImageBrush).ImageSource = sourceImageSource;
(this.targetBottomRectangle.Fill as ImageBrush).ImageSource = targetImageSource;
(Resources["TopStoryboardKey" ] as Storyboard).Begin(this);
(Resources["BottomStoryboardKey"] as Storyboard).Begin(this);
}
#endregion
#region 상위 스토리보드 완료시 처리하기 - topStoryboard_Completed(sender, e)
/// <summary>
/// 상위 스토리보드 완료시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void topStoryboard_Completed(object sender, EventArgs e)
{
(this.targetTopRectangle.Fill as ImageBrush).ImageSource = (this.targetBottomRectangle.Fill as ImageBrush).ImageSource as ImageSource;
}
#endregion
#region 하위 스토리보드 완료시 처리하기 - bottomStoryboard_Completed(sender, e)
/// <summary>
/// 하위 스토리보드 완료시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void bottomStoryboard_Completed(object sender, EventArgs e)
{
(this.sourceBottomRectangle.Fill as ImageBrush).ImageSource = (this.targetBottomRectangle.Fill as ImageBrush).ImageSource as ImageSource;
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WPF' 카테고리의 다른 글
[C#/WPF] Application, Window 클래스 상속하기 (0) | 2018.03.10 |
---|---|
[C#/WPF] XAML에서 특수 문자 사용하기 (0) | 2018.03.04 |
[C#/WPF] MediaElement 클래스 사용하기 (0) | 2018.02.18 |
[C#/WPF] RotateTransform 엘리먼트 : 마우스 진입시 이미지 회전하기 (0) | 2018.02.18 |
[C#/WPF] DoubleAnimation 엘리먼트 : 스크롤 슬라이드 사용하기 (0) | 2018.02.18 |
[C#/WPF] 이미지 뒤집기 (0) | 2018.02.18 |
[C#/WPF] 이미지 슬라이드 쇼 보여주기 (0) | 2018.02.18 |
[C#/WPF] 애니메이션 사용하기 (0) | 2018.02.18 |
[C#/WPF] XAML 시계 사용하기 (0) | 2018.02.18 |
[C#/WPF] FormattedText 클래스 : BuildGeometry 메소드를 사용해 텍스트 효과 만들기 (0) | 2018.02.18 |
댓글을 달아 주세요