|
2. AmountKoreanControl 만들기
프로젝트를 생성했을 때 기본으로 추가된 CustomControl.cs 파일을 열어서 이름을 AmountKoreanControl로 수정한후 Ctrl+.을 눌러서 이름 바꾸기를 선택해서 CustomControl로 되어있는 모든 이름을 AmountKoreanControl로 변경해 줍니다. Generic.xaml에도 이름이 변경되어야 합니다.
Generic.xaml
Custom Control을 추가하면 이 파일에 컨트롤의 기본 모양이 정의되고, 이 내용을 수정해서 AmountKoreanControl에서 구현하고자 하는 목적에 맞게 수정을 해주어야 합니다.
아래 코드를 보시면 Grid를 하나 추가하고, 2개의 Row를 넣어서 위에는 TextBlock을 아래는 TextBox를 넣어주었습니다.
TextBlock은 PART_KoreanDisplay, TextBox는 PART_Amount라는 이름을 지어 주었습니다.
PART는 CustomControl에서 사용하는 중요 부분이라는 의미로 붙여줍니다.
CustomControl에 대한 더 자세한 사항은 여기를 참고하시기 바랍니다.
AmountKoreanControl.cs
처음할 작업은 PART 컨트롤들을 제어할 수 있도록 가져오는 것입니다.
각 PART의 이름을 const로 정의하고, 그 이름을 이용해서 OnApplyTemplate()에서 컨트롤을 가져다가 내부 컨트롤에 연결시켜 줍니다.
택스트 박스의 키다운 이벤트 핸들러에서 입력가능한 키를 정의합니다.
메인 숫자키와 키패드의 숫자키의 Code값이 달라서 switch를 이용해서 한번 만들어 보았습니다. 이 switch문은 Visual Studio 2019 이상에서만 가능할 것으로 생각됩니다.
숫자키와 백스페이스, 왼쪽 화살표, 오른쪽 화살표 키만 입력 가능하도록 설정합니다.
택스트박스 텍스트체인지 이벤트 핸들러의 코드입니다.
_isWork의 기능은 텍스트 체인지 이벤트가 1번 발상한 후 동일 이벤트가 또 발생해서 처리되는 것을 방지하기 위한 것입니다.
Text를 decimal로 변환해서 DecimalToFormatString() 메소드를 호출합니다.
위에서 Amount가 등장하는데, 이 녀석은 AmountKoreanControl에 추가한 DependencyProperty입니다. 이 프로퍼티를 이용해서 뷰모델에 바인딩을 할 수 있습니다. 이 프로퍼티가 변경되면, SetAmount 메소드를 실행시켜 TextBox와 TextBlock에 데이터를 업데이트 시켜 줍니다.
control.SetAmount()를 호출하는 이유는 AmountChanged 이벤트 핸들러는 static이기 때문에, 컨트롤에 종속되어있는 SetAmount() 메소드를 호출해 주는 것입니다.
마지막으로 DecimalToFormatString과 Number2Hangle입니다. Number2Hangle는 블로그를 참고해서 만들었습니다.
if(_amountTextBox == null)은 컨트롤이 초기화 되기전에 Amount DP의 체인지 이벤트가 먼저 발생하는 경우 오류를 방지하기 위해서 추가한 코드입니다.
AmountKoreanControl.cs 전체 소스
HomePage.xaml
테스트를 위해 HomePage에 AmountKoreanControl을 올려 놓았습니다.
Amount 프로퍼티는 뷰모델의 Price와 바인딩을 했고, Init에 Price = 12345678; 이라는 코드를 추가했습니다.
3. 실행 결과
숫자 입력 창위에 한글로 금액이 출력됩니다. 하단부에는 Amount가 택스트 블럭에 출력되고 있습니다.
맨 뒤로 이동해서 백스페이스를 누르면 숫자를 지울 수 있습니다.
모든 숫자를 지우면, 한글로된 숫자도 지워지며, 택스트박스에도 아무 내용이 없습니다. 하지만, Amount는 0값을 가지고 있습니다.
4. 소스
kaki104/WpfFramework at part5/add-customcontrol (github.com)
이 컨트롤에 대한 기능 추가나 스타일 변경이 필요한 경우에는 리플로 요청하시면 확인하고 가능하면 업데이트를 하도록 하겠습니다.
첫댓글
ㅎㅎ