■ Implicit 엘리먼트의 ShowAnimations/HideAnimations/Animations 첨부 속성을 사용해 암시적 애니메이션을 만드는 방법을 보여준다.
※ 이 예제 코드에서 사용된 Implicit 엘리먼트는 CommunityToolkit.WinUI.Animations 누겟(버전 : 8.0.240109)을 참조한다.
※ 비주얼 스튜디오에서 TestProject(Unpackaged) 모드로 빌드한다.
※ TestProject.csproj 프로젝트 파일에서 WindowsPackageType 태그를 None으로 추가했다.
▶ MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<?xml version="1.0" encoding="utf-8"?> <Page x:Class="TestProject.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ctwa="using:CommunityToolkit.WinUI.Animations" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" FontFamily="나눔고딕코딩" FontSize="16"> <Grid Margin="10"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Canvas Grid.Row="0"> <Border Name="border" Canvas.Left="100" Canvas.Top="100" Width="100" Height="100" CornerRadius="{StaticResource ControlCornerRadius}" Background="{ThemeResource AccentFillColorDefaultBrush}"> <ctwa:Implicit.ShowAnimations> <ctwa:TranslationAnimation From="0, -200, 0" To="0" Duration="00:00:01" /> <ctwa:OpacityAnimation From="0" To="1.0" Duration="00:00:01" /> </ctwa:Implicit.ShowAnimations> <ctwa:Implicit.HideAnimations> <ctwa:OpacityAnimation To="0.0" Duration="00:00:01" /> <ctwa:ScalarAnimation Target="Translation.Y" To="-200" Duration="00:00:01"> <ctwa:ScalarKeyFrame Key="0.1" Value="30" /> <ctwa:ScalarKeyFrame Key="0.5" Value="0.0" /> </ctwa:ScalarAnimation> </ctwa:Implicit.HideAnimations> <ctwa:Implicit.Animations> <ctwa:OffsetAnimation Duration="00:00:01" /> <ctwa:RotationInDegreesAnimation ImplicitTarget="Offset" From="0" To="0" Duration="00:00:01.2"> <ctwa:ScalarKeyFrame Key="0.9" Value="80" /> </ctwa:RotationInDegreesAnimation> <ctwa:ScaleAnimation Duration="00:00:01" /> </ctwa:Implicit.Animations> </Border> </Canvas> <StackPanel Grid.Row="1" HorizontalAlignment="Center" Orientation="Horizontal" Spacing="10"> <Button Name="toggleVisibilityButton" Padding="10" Content="Toggle visibility" /> <Button Name="moveButton" Padding="10" Content="Move" /> <Button Name="scaleButton" Padding="10" Content="Scale" /> </StackPanel> </Grid> </Page> |
▶ MainPage.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
using System; using System.Numerics; using Microsoft.UI.Composition; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Hosting; namespace TestProject; /// <summary> /// 메인 페이지 /// </summary> public sealed partial class MainPage : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 난수기 /// </summary> private Random random = new Random(); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainPage() /// <summary> /// 생성자 /// </summary> public MainPage() { InitializeComponent(); this.toggleVisibilityButton.Click += toggleVisibilityButton_Click; this.moveButton.Click += moveButton_Click; this.scaleButton.Click += scaleButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region Toggle Visibility 버튼 클릭시 처리하기 - toggleVisibilityButton_Click(sender, e) /// <summary> /// Toggle Visibility 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void toggleVisibilityButton_Click(object sender, RoutedEventArgs e) { this.border.Visibility = this.border.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; } #endregion #region Move 버튼 클릭시 처리하기 - moveButton_Click(sender, e) /// <summary> /// Move 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void moveButton_Click(object sender, RoutedEventArgs e) { Canvas.SetTop (this.border, this.random.NextDouble() * ActualHeight); Canvas.SetLeft(this.border, this.random.NextDouble() * ActualWidth ); } #endregion #region Scale 버튼 클릭시 처리하기 - scaleButton_Click(sender, e) /// <summary> /// Scale 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void scaleButton_Click(object sender, RoutedEventArgs e) { Visual visual = ElementCompositionPreview.GetElementVisual(this.border); visual.Scale = new Vector3 ( (float)random.NextDouble() * 2, (float)random.NextDouble() * 2, 1 ); } #endregion } |