ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [WPF] IP Address Mask Control 커스텀 이벤트 추가
    WPF 2021. 12. 20. 13:04
    728x90

    안녕하세요. 저번시간에 만들었던 IP Address 컨트롤에 이제 이벤트를 추가해보고자 합니다.

    먼저 간단한 기능인 '.' 을 누르면 자연스럽게 다음 TextBox로 커서가 움직여지는 이벤트를 넣어보고자 합니다.

     

    글을 읽다보면 느끼시겠지만 다른 문제가 발생합니다.

    이건 추후에 더 수정해보고자 합니다.

     

    먼저 만들어놓은 기존의 IP Control에서 TextBox에 'PreviewKeyDown'속성을 추가해주겠습니다.

    하나의 이벤트를 생성하면 나머지 클래스가될 TextBox에서도 재활용 가능합니다.

    앞에 Preview가 찍히는걸로 봐서는 '.'키를 눌렀을때 포커스가 다음 박스로 넘어가고 '.'이 찍히는 순서인걸 확인 할 수 있습니다.

     

            <Border HorizontalAlignment="Center" VerticalAlignment="Center" BorderThickness="1" BorderBrush="Black">
                <StackPanel Margin="1" Orientation="Horizontal" >
                    <TextBox BorderThickness="0" PreviewKeyDown="MoveFocus_PreviewKeyDown" Width="50"/>
                    <TextBlock Text="."/>
                    <TextBox BorderThickness="0" PreviewKeyDown="MoveFocus_PreviewKeyDown" Width="50"/>
                    <TextBlock Text="."/>
                    <TextBox BorderThickness="0" PreviewKeyDown="MoveFocus_PreviewKeyDown" Width="50"/>
                    <TextBlock Text="."/>
                    <TextBox BorderThickness="0" Width="50"/>
                </StackPanel>
            </Border>

    코드입니다. 마지막 D클래스 부분은 PreviewKeyDown해도 넘어갈 포커스가 없기에 생략했습니다.

    이제 이벤트를 넣어볼까요?

    해당 XAML의 .cs파일입니다.

            private void MoveFocus_PreviewKeyDown(object sender, KeyEventArgs e)
            {
     
            }

    현재는 아무것도 없습니다. 

    여기에 눌린키의 값이'.'일때 focus가 바뀌는 코드를 넣어보겠습니다.

     

    '.'키는 Key.OemPeriod와 같습니다.

    그리고 FrameworkElement의 movefocus로 해당 키를 눌렀을때 다음 Control로 Focus를 옮길예정입니다.

    코드로 보시죠

            private void MoveFocus_PreviewKeyDown(object sender, KeyEventArgs e)
            {
                var frameworkElement = e.OriginalSource as FrameworkElement;
    
                if (e.Key == Key.OemPeriod)
                {
                    frameworkElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            }

    이렇게 넣어주시면 됩니다. 

    .을 누를때마다 컨트롤의 위치가 움직이지만

    이렇게 '.'이 다음 Class에 밀려 찍힌다는 단점이 있습니다.

    이부분을 알아보고 해결하면 다시 올려보도록 하겠습니다.

     

    감사합니다.

    댓글

Designed by Tistory.