숫자만 받는 textbox의 별도 세팅이 없어서 직접 만들어야 하는 상황입니다.

(아니 왜 아직도 이 기능을 안만들어놨지;;;)



검색을 해보면 방법은 여러가지가 나오지만, 일단 공통적으로 KeyPress 이벤트에서 처리를 합니다.

여기서 고민해야할 것은 이벤트를 어떻게 처리할 것인가에 대한 내용입니다.


https://social.msdn.microsoft.com/Forums/windowsapps/en-US/296b348d-778f-46ef-b0be-2ae5a43341a2/uwp-how-to-enter-only-numbersdigits-in-textbox?forum=wpdevelop


이쪽의 내용을 참고했는데, 댓글로 달린 내용을 보다보면 이 안에서 루프를 돌면서 검사를 하는 것이 있습니다.

저렇게 만들까 하다가, 어차피 지금 제작중인 앱에서는 제법 많이 사용될 기능이기 때문에 저 안에서 계속해서 O(n)의 시간이 소요되는 것은 좋아보이지 않았습니다.

(링크 댓글에는 그냥 0~9까지의 숫자가 있지만, 실제로 VirtualKey의 숫자 관련 입력을 보면 Numpad도 있어서 별도로 처리해야합니다)


결국 고민하다가, 초기에 Dictionary(C++에서의 map)을 만들어서 지금 들어온 입력이 숫자인지 아닌지를 확인하도록 하게 했습니다.



        protected async void MakeNumKeyDic()
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                m_dicNumKey.Add(VirtualKey.Back, true);
                m_dicNumKey.Add(VirtualKey.Number0, true);
                m_dicNumKey.Add(VirtualKey.Number1, true);
                m_dicNumKey.Add(VirtualKey.Number2, true);
                m_dicNumKey.Add(VirtualKey.Number3, true);
                m_dicNumKey.Add(VirtualKey.Number4, true);
                m_dicNumKey.Add(VirtualKey.Number5, true);
                m_dicNumKey.Add(VirtualKey.Number6, true);
                m_dicNumKey.Add(VirtualKey.Number7, true);
                m_dicNumKey.Add(VirtualKey.Number8, true);
                m_dicNumKey.Add(VirtualKey.Number9, true);
                m_dicNumKey.Add(VirtualKey.NumberPad0, true);
                m_dicNumKey.Add(VirtualKey.NumberPad1, true);
                m_dicNumKey.Add(VirtualKey.NumberPad2, true);
                m_dicNumKey.Add(VirtualKey.NumberPad3, true);
                m_dicNumKey.Add(VirtualKey.NumberPad4, true);
                m_dicNumKey.Add(VirtualKey.NumberPad5, true);
                m_dicNumKey.Add(VirtualKey.NumberPad6, true);
                m_dicNumKey.Add(VirtualKey.NumberPad7, true);
                m_dicNumKey.Add(VirtualKey.NumberPad8, true);
                m_dicNumKey.Add(VirtualKey.NumberPad9, true);
            });
        }


이런식으로 등록해두고,



        private void LevelTextBox_KeyDown(object sender, KeyRoutedEventArgs e)
        {
            if (rootPage.m_dicNumKey.ContainsKey(e.Key) == false)
            {
                e.Handled = true;
            }
        }


이런식으로 사용하게 했습니다.

레벨 관련이라 max치를 두게 해야하는데 이 부분도 좀 생각해야겠네요.

'Programming > C#' 카테고리의 다른 글

[UWP] createfile access denied  (0) 2018.05.17
[UWP] 앱 종료(OnSuspending)  (0) 2018.05.16
[UWP] number textbox  (0) 2018.05.14
[UWP] global::System.Diagnostics.Debugger.Break()  (0) 2018.05.12
[UWP] async await 그리고 동기화  (0) 2018.05.11
[UWP] File Open 관련  (0) 2018.05.08

+ Recent posts