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

■ ContentControl 클래스 : 텍스트 리스트 컨트롤 만들기

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

using System;

using System.Windows.Controls;

using System.Windows.Input;

 

/// <summary>

/// 텍스트 리스트 컨트롤

/// </summary>

public class TextListControl : ContentControl

{

    //////////////////////////////////////////////////////////////////////////////////////////////////// Declaration

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

 

    #region Event

 

    /// <summary>

    /// 텍스트 변경시

    /// </summary>

    public event TextChangedEventHandler TextChanged;

 

    /// <summary>

    /// 선택 변경시

    /// </summary>

    public event EventHandler SelectionChanged;

 

    #endregion

 

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

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

 

    #region Field

 

    /// <summary>

    /// 텍스트 상자

    /// </summary>

    private TextBox textBox;

 

    /// <summary>

    /// 리스트 컨트롤

    /// </summary>

    private ListControl listControl;

 

    /// <summary>

    /// 읽기 전용 여부

    /// </summary>

    private bool isReadOnly;

 

    #endregion

 

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

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

 

    #region 텍스트 - Text

 

    /// <summary>

    /// 텍스트

    /// </summary>

    public string Text

    {

        set

        {

            this.textBox.Text = value;

        }

        get

        {

            return this.textBox.Text;

        }

    }

 

    #endregion

 

    #region 읽기 전용 여부 - IsReadOnly

 

    /// <summary>

    /// 읽기 전용 여부

    /// </summary>

    public bool IsReadOnly

    {

        set

        {

            this.isReadOnly = value;

 

            this.textBox.IsReadOnly = this.isReadOnly;

        }

        get

        {

            return this.isReadOnly;

        }

    }

 

    #endregion

 

    #region 선택 인덱스 - SelectedIndex

 

    /// <summary>

    /// 선택 인덱스

    /// </summary>

    public int SelectedIndex

    {

        get

        {

            return this.listControl.SelectedIndex;

        }

        set

        {

            this.listControl.SelectedIndex = value;

 

            if(this.listControl.SelectedIndex == -1)

            {

                this.textBox.Text = string.Empty;

            }

            else

            {

                this.textBox.Text = this.listControl.SelectedItem.ToString();

            }

        }

    }

 

    #endregion

 

    #region 선택 항목 - SelectedItem

 

    /// <summary>

    /// 선택 항목

    /// </summary>

    public object SelectedItem

    {

        get

        {

            return this.listControl.SelectedItem;

        }

        set

        {

            this.listControl.SelectedItem = value;

 

            if(this.listControl.SelectedItem != null)

            {

                this.textBox.Text = this.listControl.SelectedItem.ToString();

            }

            else

            {

                this.textBox.Text = string.Empty;

            }

        }

    }

 

    #endregion

 

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

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

 

    #region 생성자 - TextListControl()

 

    /// <summary>

    /// 생성자

    /// </summary>

    public TextListControl()

    {

        DockPanel dockPanel = new DockPanel();

 

        Content = dockPanel;

 

        this.textBox = new TextBox();

 

        this.textBox.TextChanged += this.textBox_TextChanged;

 

        dockPanel.Children.Add(this.textBox);

 

        DockPanel.SetDock(this.textBox, Dock.Top);

 

        this.listControl = new ListControl();

 

        this.listControl.SelectionChanged += this.listControl_SelectionChanged;

 

        dockPanel.Children.Add(this.listControl);

    }

 

    #endregion

 

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

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

    //////////////////////////////////////////////////////////////////////////////// Function

 

    #region 지우기 - Clear()

 

    /// <summary>

    /// 지우기

    /// </summary>

    public void Clear()

    {

        this.listControl.Clear();

    }

 

    #endregion

 

    #region 추가하기 - Add(value)

 

    /// <summary>

    /// 추가하기

    /// </summary>

    /// <param name="value"></param>

    public void Add(object value)

    {

        this.listControl.Add(value);

    }

 

    #endregion

 

    #region 삽입하기 - Insert(index, value)

 

    /// <summary>

    /// 삽입하기

    /// </summary>

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

    /// <param name="value"></param>

    public void Insert(int index, object value)

    {

        this.listControl.Insert(index, value);

    }

 

    #endregion

 

    #region 포함 여부 조사하기 - Contains(value)

 

    /// <summary>

    /// 포함 여부 조사하기

    /// </summary>

    /// <param name="value"></param>

    /// <returns>포함 여부</returns>

    public bool Contains(object value)

    {

        return this.listControl.Contains(value);

    }

 

    #endregion

 

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

 

    #region 마우스 DOWN 처리하기 - OnMouseDown(e)

 

    /// <summary>

    /// 마우스 DOWN 처리하기

    /// </summary>

    /// <param name="e">이벤트 인자</param>

    protected override void OnMouseDown(MouseButtonEventArgs e)

    {

        base.OnMouseDown(e);

 

        Focus();

    }

 

    #endregion

 

    #region 키보드 포커스 획득시 처리하기 - OnGotKeyboardFocus(e)

 

    /// <summary>

    /// 키보드 포커스 획득시 처리하기

    /// </summary>

    /// <param name="e">이벤트 인자</param>

    protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)

    {

        base.OnGotKeyboardFocus(e);

 

        if(e.NewFocus == this)

        {

            this.textBox.Focus();

 

            if(SelectedIndex == -1 && this.listControl.Count > 0)

            {

                SelectedIndex = 0;

            }

        }

    }

 

    #endregion

 

    #region 텍스트 입력시 사전 처리하기 - OnPreviewTextInput(e)

 

    /// <summary>

    /// 텍스트 입력시 사전 처리하기

    /// </summary>

    /// <param name="e">이벤트 인자</param>

    protected override void OnPreviewTextInput(TextCompositionEventArgs e)

    {

        base.OnPreviewTextInput(e);

 

        if(IsReadOnly)

        {

            if(e.Text.Length > 0)

            {

                this.listControl.GoToLetter(e.Text[0]);

 

                e.Handled = true;

            }

        }

    }

 

    #endregion

 

    #region 키 DOWN 사전 처리하기 - OnPreviewKeyDown(e)

 

    /// <summary>

    /// 키 DOWN 사전 처리하기

    /// </summary>

    /// <param name="e">이벤트 인자</param>

    protected override void OnPreviewKeyDown(KeyEventArgs e)

    {

        base.OnPreviewKeyDown(e);

 

        if(SelectedIndex == -1)

        {

            return;

        }

 

        switch(e.Key)

        {

            case Key.Home :

 

                if(this.listControl.Count > 0)

                {

                    SelectedIndex = 0;

                }

 

                break;

 

            case Key.End :

 

                if(this.listControl.Count > 0)

                {

                    SelectedIndex = this.listControl.Count - 1;

                }

 

                break;

 

            case Key.Up :

 

                if(SelectedIndex > 0)

                {

                    SelectedIndex--;

                }

 

                break;

 

            case Key.Down :

 

                if(SelectedIndex < this.listControl.Count - 1)

                {

                    SelectedIndex++;

                }

 

                break;

 

            case Key.PageUp :

 

                this.listControl.PageUp();

 

                break;

 

            case Key.PageDown :

 

                this.listControl.PageDown();

 

                break;

 

            default :

 

                return;

        }

 

        e.Handled = true;

    }

 

    #endregion

 

    #region 선택 변경시 처리하기 - OnSelectionChanged(e)

 

    /// <summary>

    /// 선택 변경시 처리하기

    /// </summary>

    /// <param name="e">이벤트 인자</param>

    protected virtual void OnSelectionChanged(EventArgs e)

    {

        if(SelectionChanged != null)

        {

            SelectionChanged(this, e);

        }

    }

 

    #endregion

 

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

 

    #region 텍스트 상자 텍스트 변경시 처리하기 - textBox_TextChanged(sender, e)

 

    /// <summary>

    /// 텍스트 상자 텍스트 변경시 처리하기

    /// </summary>

    /// <param name="sender">이벤트 발생자</param>

    /// <param name="e">이벤트 인자</param>

    private void textBox_TextChanged(object sender, TextChangedEventArgs e)

    {

        if(TextChanged != null)

        {

            TextChanged(this, e);

        }

    }

 

    #endregion

 

    #region 리스트 컨트롤 선택 변경시 처리하기 - listControl_SelectionChanged(sender, e)

 

    /// <summary>

    /// 리스트 컨트롤 선택 변경시 처리하기

    /// </summary>

    /// <param name="sender">이벤트 발생자</param>

    /// <param name="e">이벤트 인자</param>

    private void listControl_SelectionChanged(object sender, EventArgs e)

    {

        if(SelectedIndex == -1)

        {

            this.textBox.Text = string.Empty;

        }

        else

        {

            this.textBox.Text = this.listControl.SelectedItem.ToString();

        }

 

        OnSelectionChanged(e);

    }

 

    #endregion

}

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

※ ListControl : "ContentControl 클래스 : 리스트 컨트롤 만들기" 참조

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요