첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ Decorator 클래스 : SimpleDecorator 클래스 만들기

----------------------------------------------------------------------------------------------------

using System;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

 

/// <summary>

/// 단순 데코레이터

/// </summary>

public class SimpleDecorator : Decorator

{

    //////////////////////////////////////////////////////////////////////////////////////////////////// Field

    ////////////////////////////////////////////////////////////////////////////////////////// Static

    //////////////////////////////////////////////////////////////////////////////// Public

 

    #region Field

 

    /// <summary>

    /// 눌림 여부 속성

    /// </summary>

    public static readonly DependencyProperty IsPressedProperty;

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Property

    ////////////////////////////////////////////////////////////////////////////////////////// Public

 

    #region 눌림 여부 - IsPressed

 

    /// <summary>

    /// 눌림 여부

    /// </summary>

    public bool IsPressed

    {

        set

        {

            SetValue(IsPressedProperty, value);

        }

        get

        {

            return (bool)GetValue(IsPressedProperty);

        }

    }

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

    ////////////////////////////////////////////////////////////////////////////////////////// Static

 

    #region 생성자 - SimpleDecorator()

 

    /// <summary>

    /// 생성자

    /// </summary>

    static SimpleDecorator()

    {

        IsPressedProperty = DependencyProperty.Register

        (

            "IsPressed",

            typeof(bool),

            typeof(SimpleDecorator),

            new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)

        );

    }

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method

    ////////////////////////////////////////////////////////////////////////////////////////// Protected

 

    #region 측정하기 (오버라이딩) - MeasureOverride(availableSize)

 

    /// <summary>

    /// 측정하기 (오버라이딩)

    /// </summary>

    /// <param name="availableSize">이용 가능한 크기</param>

    /// <returns>측정 크기</returns>

    protected override Size MeasureOverride(Size availableSize)

    {

        Size desiredSize = new Size(2, 2);

 

        availableSize.Width  -= 2;

        availableSize.Height -= 2;

 

        if(Child != null)

        {

            Child.Measure(availableSize);

 

            desiredSize.Width  += Child.DesiredSize.Width;

            desiredSize.Height += Child.DesiredSize.Height;

        }

 

        return desiredSize;

    }

 

    #endregion

 

    #region 배열하기 (오버라이딩) - ArrangeOverride(finalSize)

 

    /// <summary>

    /// 배열하기 (오버라이딩)

    /// </summary>

    /// <param name="finalSize">최종 크기</param>

    /// <returns>최종 크기</returns>

    protected override Size ArrangeOverride(Size finalSize)

    {

        if(Child != null)

        {

            Point childPoint = new Point

            (

                Math.Max(1, (finalSize.Width  - Child.DesiredSize.Width ) / 2),

                Math.Max(1, (finalSize.Height - Child.DesiredSize.Height) / 2)

            );

 

            Child.Arrange(new Rect(childPoint, Child.DesiredSize));

        }

 

        return finalSize;

    }

 

    #endregion

 

    #region 렌더링 처리하기 - OnRender(drawingContext)

 

    /// <summary>

    /// 렌더링 처리하기

    /// </summary>

    /// <param name="drawingContext">DrawingContext</param>

    protected override void OnRender(DrawingContext drawingContext)

    {

        RadialGradientBrush brush = new RadialGradientBrush

        (

            IsPressed ? SystemColors.ControlDarkColor : SystemColors.ControlLightLightColor,

            SystemColors.ControlColor

        );

 

        brush.GradientOrigin = IsPressed ? new Point(0.75, 0.75) : new Point(0.25, 0.25);

 

        drawingContext.DrawRoundedRectangle

        (

            brush,

            new Pen(SystemColors.ControlDarkDarkBrush, 1),

            new Rect(new Point(0, 0), RenderSize),

            RenderSize.Height / 2,

            RenderSize.Height / 2

        );

    }

 

    #endregion

}

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요