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

■ Panel 클래스 : 단순 유니폼 그리드 컨트롤 만들기

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

using System;

using System.Windows;

using System.Windows.Controls;

 

/// <summary>

/// 단순 유니폼 그리드

/// </summary>

public class SimpleUniformGrid : Panel

{

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

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

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

 

    #region Field

 

    /// <summary>

    /// 컬럼 수 속성

    /// </summary>

    public static readonly DependencyProperty ColumnCountProperty;

 

    #endregion

 

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

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

 

    #region 컬럼 수 - ColumnCount

 

    /// <summary>

    /// 컬럼 수

    /// </summary>

    public int ColumnCount

    {

        set

        {

            SetValue(ColumnCountProperty, value);

        }

        get

        {

            return (int)GetValue(ColumnCountProperty);

        }

    }

 

    #endregion

    #region 행 수 - RowCount

 

    /// <summary>

    /// 행 수

    /// </summary>

    public int RowCount

    {

        get

        {

            return (InternalChildren.Count + ColumnCount - 1) / ColumnCount;

        }

    }

 

    #endregion

 

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

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

 

    #region 생성자 - SimpleUniformGrid()

 

    /// <summary>

    /// 생성자

    /// </summary>

    static SimpleUniformGrid()

    {

        ColumnCountProperty = DependencyProperty.Register

        (

            "ColumnCount",

            typeof(int),

            typeof(SimpleUniformGrid),

            new FrameworkPropertyMetadata

            (

                1,

                FrameworkPropertyMetadataOptions.AffectsMeasure

            )

        );

    }

 

    #endregion

 

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

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

 

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

 

    /// <summary>

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

    /// </summary>

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

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

    protected override Size MeasureOverride(Size availableSize)

    {

        Size childSize = new Size(availableSize.Width / ColumnCount, availableSize.Height / RowCount);

 

        double maximumWidth  = 0;

        double maximumHeight = 0;

 

        foreach(UIElement childUIElement in InternalChildren)

        {

            childUIElement.Measure(childSize);

 

            maximumWidth  = Math.Max(maximumWidth , childUIElement.DesiredSize.Width );

            maximumHeight = Math.Max(maximumHeight, childUIElement.DesiredSize.Height);

        }

 

        return new Size(ColumnCount * maximumWidth, RowCount * maximumHeight);

    }

 

    #endregion

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

 

    /// <summary>

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

    /// </summary>

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

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

    protected override Size ArrangeOverride(Size finalSize)

    {

        Size childSize = new Size

        (

            finalSize.Width  / ColumnCount,

            finalSize.Height / RowCount

        );

 

        for(int index = 0; index < InternalChildren.Count; index++)

        {

            int row    = index / ColumnCount;

            int column = index % ColumnCount;

 

            Rect childRect = new Rect(new Point(column * childSize.Width, row * childSize.Height), childSize);

 

            InternalChildren[index].Arrange(childRect);

        }

 

        return finalSize;

    }

 

    #endregion

}

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

Posted by 사용자 icodebroker

댓글을 달아 주세요