첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
728x90
728x170

TestProject.zip
다운로드

▶ 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&lt;T&gt; 클래스 : 텍스트 변경시 트리거 사용하기"
    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
그리드형(광고전용)
Posted by icodebroker
,