닷넷/WPF
C# WPF TextBlock의 Text를 오른쪽에서 왼쪽으로 애니메이션(BeginAnimation, 롤링) 하는방법
FreeBear
2023. 3. 21. 13:10
반응형
1. MainWindow.xaml 뷰에는 텍스트를 입력하는 TextBox와 TextBox에 입력된 텍스트가 바인딩되는 TextBlock이 있습니다.
<Window x:Class="WPF_TextBlocK_Rolling.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_TextBlocK_Rolling"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<StackPanel>
<TextBox x:Name="inputText" Text="여기에 롤링 텍스트를 입력하세요." FontSize="24" />
<Canvas Grid.Row="1" x:Name="canvas">
<TextBlock x:Name="rollingText" Text="{Binding Text, ElementName=inputText}" FontSize="24" Canvas.Left="0" SizeChanged="rollingText_SizeChanged"/>
</Canvas>
</StackPanel>
</Grid>
</Window>
2. MainWindow.xaml.cs 뷰의 비하인드 코드에 TextBlock의 크기가 Canvas 크기를 넘어가면 애니메이션이 시작되고, 넘어가지 않으면 중지되는 StartRollingAnimation 메소드를 작성합니다.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;
namespace WPF_TextBlocK_Rolling
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
// TextBlock의 원래 위치를 저장하는 변수
private double rollingTextOriginalLeft;
public MainWindow()
{
InitializeComponent();
// TextBlock의 원래 위치를 저장
rollingTextOriginalLeft = rollingText.ActualWidth;
}
private void StartRollingAnimation()
{
// TextBlock의 너비가 캔버스 너비보다 크면 애니메이션 시작
if (rollingText.ActualWidth > canvas.ActualWidth)
{
DoubleAnimation rollingAnimation = new DoubleAnimation
{
From = canvas.ActualWidth, // 시작 위치
To = -rollingText.ActualWidth, // 종료 위치
Duration = new Duration(TimeSpan.FromSeconds(30)), // 애니메이션 지속 시간
RepeatBehavior = RepeatBehavior.Forever // 반복 여부
};
rollingText.BeginAnimation(Canvas.LeftProperty, rollingAnimation);
}
else
{
// TextBlock의 너비가 캔버스 너비보다 작으면 애니메이션 중지
rollingText.BeginAnimation(Canvas.LeftProperty, null);
// TextBlock의 위치를 원래 위치로 조정하여 텍스트가 고정적으로 표시되도록 함
Canvas.SetLeft(rollingText, rollingTextOriginalLeft);
// TextBlock을 가운데 정렬하려면 아래와 같이 코딩
// double left = (canvas.ActualWidth - rollingText.ActualWidth) / 2;
// Canvas.SetLeft(rollingText, left);
}
}
private void rollingText_SizeChanged(object sender, SizeChangedEventArgs e)
{
// TextBlock의 크기가 변경될 때마다 애니메이션 재시작
StartRollingAnimation();
}
}
}
시작 위치는 Canvas의 너비로 하고 종료 위치는 TextBlock의 너비에서 마이너스를 하면 오른쪽에서 왼쪽으로 애니메이션 됩니다.
왼쪽에서 오른쪽으로 애니메이션되게 하려면 시작위치는 0으로 하고, 종료 위치는 TextBlock의 너비로 하면 됩니다.
From = 0, // 시작 위치
To = rollingText.ActualWidth, // 종료 위치
반응형