WPF

WPF 천단위 숫자입력 TextBox UserControl작성

지오준 2021. 2. 27.
반응형

1.샘플이미지

2.디자인 소스코드

<UserControl x:Class="NumberTextBox.NumberInputTextBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:NumberTextBox">
    <StackPanel Orientation="Horizontal">
        <TextBox x:Name="txtNumberInput" HorizontalAlignment="Left" TextAlignment="Right" VerticalAlignment="Center" Width="120" Height="20" MaxLength="15"></TextBox>
    </StackPanel>
</UserControl>

3. 프로그램 소스코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace NumberTextBox
{
    /// <summary>
    /// Interaction logic for NumberTextBox.xaml
    /// </summary>
    public partial class NumberInputTextBox : UserControl
    {
        /// <summary>
        /// TextBox바인드 데이터타입선언
        /// </summary>
        public double Amount { set; get; }

        /// <summary>
        /// 텍스트박스의 모든텍스트값을 리턴해줄 변수선언
        /// </summary>
        private string _Text { get; set; }
        public string Text
        {
            get { return _Text; }   // get method
            set { _Text = value; }  // set method
        }

        /// <summary>
        /// 텍스트박스의 숫자값을 리턴해줄 상수선언
        /// </summary>
        private double _Number { get; set; }
        public double Number
        {
            get { return _Number; }   // get method
            set { _Number = value; }  // set method
        }

        public NumberInputTextBox()
        {
            InitializeComponent();
            //데이터타입 바인딩 선언
            Binding myBinding = new Binding("Amount");
            //바인딩에 출력포맷을 설정
            myBinding.Source = this; myBinding.StringFormat = "{0:N0}";
            //바인딩을 갱신처리해서 바로 적용하도록 이벤트 추가
            myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            //텍스트박스에 바인딩을 설정
            txtNumberInput.SetBinding(TextBox.TextProperty, myBinding);
            //텍스트박스의 입력이벤트 선언
            txtNumberInput.PreviewTextInput += txtNumberInput_PreviewTextInput;
            //텍스트박스의 값 변경이벤트 선언
            txtNumberInput.TextChanged += txtNumberInput_TextChanged;
        }

        /// <summary>
        /// 텍스트박스에 숫자만 입력가능하게 수정
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtNumberInput_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            //IsDigit함수이용
            if (!char.IsDigit(e.Text, e.Text.Length - 1)) e.Handled = true;
        }

        /// <summary>
        /// 텍스트박스의 값변경 이벤트
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtNumberInput_TextChanged(object sender, TextChangedEventArgs e)
        {
            this._Text = txtNumberInput.Text.Trim();
            this._Number = Convert.ToDouble(txtNumberInput.Text.Replace(",", string.Empty) == string.Empty ? "0" : txtNumberInput.Text.Replace(",", string.Empty));
        }
    }
}

4. 샘플프로젝트

NumberTextBox.zip
0.06MB

 

반응형

댓글