728x90
728x170
▶ TextChangedTrigger.cs
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;
namespace TestProject
{
/// <summary>
/// 텍스트 변경시 트리거
/// </summary>
public class TextChangedTrigger : TriggerBase<TextBlock>
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Protected
#region 부착시 처리하기 - OnAttached()
/// <summary>
/// 부착시 처리하기
/// </summary>
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += AssociatedObject_Loaded;
}
#endregion
#region 탈착시 처리하기 - OnDetaching()
/// <summary>
/// 탈착시 처리하기
/// </summary>
protected override void OnDetaching()
{
AssociatedObject.Loaded -= AssociatedObject_Loaded;
base.OnDetaching();
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 결합 객체 로드시 처리하기 - AssociatedObject_Loaded(sender, e)
/// <summary>
/// 결합 객체 로드시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
TextBlock textBlock = AssociatedObject as TextBlock;
if(textBlock == null)
{
return;
}
DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty
(
TextBlock.TextProperty,
typeof(TextBlock)
);
if(descriptor == null)
{
return;
}
descriptor.AddValueChanged(textBlock, textBlock_TextChanged);
}
#endregion
#region 텍스트 블럭 텍스트 변경시 처리하기 - textBlock_TextChanged(sender, e)
/// <summary>
/// 텍스트 블럭 텍스트 변경시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void textBlock_TextChanged(object sender, EventArgs e)
{
TextBlock textBlock = sender as TextBlock;
if(textBlock == null)
{
return;
}
InvokeActions(null);
}
#endregion
}
}
728x90
▶ 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"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:local="clr-namespace:TestProject"
Width="800"
Height="600"
Title="TriggerBase<T> 클래스 : 텍스트 변경시 트리거 사용하기"
FontFamily="나눔고딕코딩"
FontSize="16">
<Window.Resources>
<Storyboard x:Key="hourStoryboard">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="hourTextBlock"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.1">
<EasingDoubleKeyFrame.EasingFunction>
<SineEase EasingMode="EaseIn" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<SineEase EasingMode="EaseOut" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="minuteStoryboard">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="minuteTextBlock"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.1">
<EasingDoubleKeyFrame.EasingFunction>
<SineEase EasingMode="EaseIn" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<SineEase EasingMode="EaseOut" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="secondStoryboard">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="secondTextBlock"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.1">
<EasingDoubleKeyFrame.EasingFunction>
<SineEase EasingMode="EaseIn" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<SineEase EasingMode="EaseOut" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources>
<Grid>
<Grid
HorizontalAlignment="Center"
VerticalAlignment="Center">
<Grid.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="FontSize" Value="100" />
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- 시 -->
<TextBlock x:Name="hourTextBlock" Grid.Column="0"
RenderTransformOrigin="0.5 1"
Text="00">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform />
<TranslateTransform />
</TransformGroup>
</TextBlock.RenderTransform>
<i:Interaction.Triggers>
<local:TextChangedTrigger>
<ei:ControlStoryboardAction Storyboard="{StaticResource hourStoryboard}" />
</local:TextChangedTrigger>
</i:Interaction.Triggers>
</TextBlock>
<TextBlock Grid.Column="1"
Text=":" />
<!-- 분 -->
<TextBlock x:Name="minuteTextBlock" Grid.Column="2"
RenderTransformOrigin="0.5 1"
Text="00">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform />
<TranslateTransform />
</TransformGroup>
</TextBlock.RenderTransform>
<i:Interaction.Triggers>
<local:TextChangedTrigger>
<ei:ControlStoryboardAction Storyboard="{StaticResource minuteStoryboard}" />
</local:TextChangedTrigger>
</i:Interaction.Triggers>
</TextBlock>
<TextBlock Grid.Column="3"
Text=":" />
<!-- 초 -->
<TextBlock x:Name="secondTextBlock" Grid.Column="4"
RenderTransformOrigin="0.5 1"
Text="00">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform />
<TranslateTransform />
</TransformGroup>
</TextBlock.RenderTransform>
<i:Interaction.Triggers>
<local:TextChangedTrigger>
<ei:ControlStoryboardAction Storyboard="{StaticResource secondStoryboard}" />
</local:TextChangedTrigger>
</i:Interaction.Triggers>
</TextBlock>
</Grid>
</Grid>
</Window>
300x250
▶ MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Threading;
namespace TestProject
{
/// <summary>
/// 메인 윈도우
/// </summary>
public partial class MainWindow : Window
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary>
/// 생성자
/// </summary>
public MainWindow()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(1)
};
timer.Tick += timer_Tick;
timer.Start();
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 타이머 틱 처리하기 - timer_Tick(sender, e)
/// <summary>
/// 타이머 틱 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void timer_Tick(object sender, EventArgs e)
{
if(DateTime.Now.Hour > 12)
{
this.hourTextBlock.Text = (DateTime.Now.Hour - 12).ToString("D2");
}
else
{
this.hourTextBlock.Text = DateTime.Now.Hour.ToString("D2");
}
this.minuteTextBlock.Text = DateTime.Now.Minute.ToString("D2");
this.secondTextBlock.Text = DateTime.Now.Second.ToString("D2");
}
#endregion
}
}
728x90
그리드형(광고전용)
'C# > WPF' 카테고리의 다른 글
[C#/WPF] DataGridTextColumn 엘리먼트 : 텍스트 컬럼 사용하기 (0) | 2020.09.19 |
---|---|
[C#/WPF] DependencyPropertyDescriptor 클래스 : AddValueChanged 메소드를 사용해 의존 속성 값 변경시 통지하기 (0) | 2020.09.19 |
[C#/WPF] ObjectDataProvider 엘리먼트 : 열거형 타입 구하기 (0) | 2020.09.18 |
[C#/WPF] DataGrid 엘리먼트 : 커스텀 컬럼 사용하기 (0) | 2020.09.18 |
[C#/WPF] TriggerAction<T> 클래스 : 전경색 변경 액션 사용하기 (0) | 2020.09.18 |
[C#/WPF] Behavior<T> 클래스 : 배타적 익스팬더 동작 사용하기 (0) | 2020.09.18 |
[C#/WPF] 누겟 설치 : Expression.Blend.Sdk (0) | 2020.09.18 |
[C#/WPF] 누겟 설치 : WindowsAPICodePack-Shell (0) | 2020.09.18 |
[C#/WPF] 누겟 설치 : Microsoft.Xaml.Behaviors.Wpf (0) | 2020.09.18 |
[C#/WPF] MultiBinding 엘리먼트 : StringFormat 속성을 사용해 문자열 포맷 설정하기 (0) | 2020.09.18 |