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

■ FrameworkElement 클래스 : DiagonalPanel 클래스 만들기

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

using System;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Media;

 

/// <summary>

/// 대각선 패널

/// </summary>

public class DiagonalPanel : FrameworkElement

{

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

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

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

 

    #region Field

 

    /// <summary>

    /// 배경 속성

    /// </summary>

    public static readonly DependencyProperty BackgroundProperty;

 

    #endregion

 

    ////////////////////////////////////////////////////////////////////////////////////////// Instance

    //////////////////////////////////////////////////////////////////////////////// Private

 

    #region Field

 

    /// <summary>

    /// 자식 UIElement 리스트

    /// </summary>

    private List<UIElement> childUIElementList = new List<UIElement>();

 

    /// <summary>

    /// 전체 자식들 크기

    /// </summary>

    private Size totalChildrenSize;

 

    #endregion

 

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

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

 

    #region 배경 - Background

 

    /// <summary>

    /// 배경

    /// </summary>

    public Brush Background

    {

        set

        {

            SetValue(BackgroundProperty, value);

        }

        get

        {

            return (Brush)GetValue(BackgroundProperty);

        }

    }

 

    #endregion

 

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

 

    #region 비주얼 자식 수 - VisualChildrenCount

 

    /// <summary>

    /// 비주얼 자식 수

    /// </summary>

    protected override int VisualChildrenCount

    {

        get

        {

            return this.childUIElementList.Count;

        }

    }

 

    #endregion

 

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

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

 

    #region 생성자 - DiagonalPanel()

 

    /// <summary>

    /// 생성자

    /// </summary>

    static DiagonalPanel()

    {

        BackgroundProperty = DependencyProperty.Register

        (

            "Background",

            typeof(Brush),

            typeof(DiagonalPanel),

            new FrameworkPropertyMetadata

            (

                null,

                FrameworkPropertyMetadataOptions.AffectsRender

            )

        );

    }

 

    #endregion

 

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

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

 

    #region 추가하기 - Add(uiElement)

 

    /// <summary>

    /// 추가하기

    /// </summary>

    /// <param name="uiElement">UIElement</param>

    public void Add(UIElement uiElement)

    {

        this.childUIElementList.Add(uiElement);

 

        AddVisualChild(uiElement);

 

        AddLogicalChild(uiElement);

 

        InvalidateMeasure();

    }

 

    #endregion

 

    #region 제거하기 - Remove(uiElement)

 

    /// <summary>

    /// 제거하기

    /// </summary>

    /// <param name="uiElement">UIElement</param>

    public void Remove(UIElement uiElement)

    {

        this.childUIElementList.Remove(uiElement);

 

        RemoveVisualChild(uiElement);

 

        RemoveLogicalChild(uiElement);

 

        InvalidateMeasure();

    }

 

    #endregion

 

    #region 인덱스 구하기 - IndexOf(uiElement)

 

    /// <summary>

    /// 인덱스 구하기

    /// </summary>

    /// <param name="uiElement">UIElement</param>

    /// <returns>인덱스</returns>

    public int IndexOf(UIElement uiElement)

    {

        return this.childUIElementList.IndexOf(uiElement);

    }

 

    #endregion

 

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

 

    #region 비주얼 자식 구하기 - GetVisualChild(index)

 

    /// <summary>

    /// 비주얼 자식 구하기

    /// </summary>

    /// <param name="index">인덱스</param>

    /// <returns>Visual</returns>

    protected override Visual GetVisualChild(int index)

    {

        if(index >= this.childUIElementList.Count)

        {

            throw new ArgumentOutOfRangeException("index");

        }

 

        return this.childUIElementList[index];

    }

 

    #endregion

 

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

 

    /// <summary>

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

    /// </summary>

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

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

    protected override Size MeasureOverride(Size availableSize)

    {

        this.totalChildrenSize = new Size(0, 0);

 

        foreach(UIElement childUIElement in this.childUIElementList)

        {

            childUIElement.Measure

            (

                new Size

                (

                    Double.PositiveInfinity,

                    Double.PositiveInfinity

                )

            );

 

            this.totalChildrenSize.Width  += childUIElement.DesiredSize.Width;

            this.totalChildrenSize.Height += childUIElement.DesiredSize.Height;

        }

 

        return this.totalChildrenSize;

    }

 

    #endregion

 

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

 

    /// <summary>

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

    /// </summary>

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

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

    protected override Size ArrangeOverride(Size finalSize)

    {

        Point childPoint = new Point(0, 0);

 

        foreach(UIElement childUIElement in this.childUIElementList)

        {

            Size childSize = new Size(0, 0);

 

            childSize.Width  = childUIElement.DesiredSize.Width  * (finalSize.Width  / this.totalChildrenSize.Width );

            childSize.Height = childUIElement.DesiredSize.Height * (finalSize.Height / this.totalChildrenSize.Height);

 

            childUIElement.Arrange(new Rect(childPoint, childSize));

 

            childPoint.X += childSize.Width;

            childPoint.Y += childSize.Height;

        }

 

        return finalSize;

    }

 

    #endregion

 

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

 

    /// <summary>

    /// 렌더링 처리하기

    /// </summary>

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

    protected override void OnRender(DrawingContext drawingContext)

    {

        drawingContext.DrawRectangle(Background, null, new Rect(new Point(0, 0), RenderSize));

    }

 

    #endregion

}

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

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요