http://dotnetmvp.tistory.com/37

15. [WPF 기초 강좌] 사용자입력 1


안녕하세요.

WPF 기초강좌를 진행하는 김창민입니다.

 

 

이제 완전 따듯한 봄이되었내요...

아직 꽃들만 피지 않았지 바람은 따듯한 바람이 불어옵니다.

좀더 더워지기전에 스피치를 올려 강좌에 집중해야겠내요.. ㅋㅋ

 

 

그럼 오늘 강좌를 시작하겠습니다.


오늘 같이 알아볼 내용은 사용자 입력으로 사용자가 직접 키보드나 마우스스타일러스 펜 등을 이용하여 값을 추가변경하거나 이벤트를 발행 시키고자 할 때 사용하는 입력 방식을 말합니다.

그 중에서 오늘은 키보드를 이용한 입력방식에 대해 알아볼 것이며 간단한 예제로 키입력 이벤트나 클래스에서 지원하는 메서드의 사용방법에 대해 알아보겠습니다.



기본적으로 입력을 관리하는 입력API는 UIElement, ContentElement, FrameworkElement  FrameworkContentElement의 영향을 받으며 키 입력마우스 버튼클릭마우스 휠 Up-Down, 마우스 이동 등에 관한 입력 이벤트를 제공해 줍니다입력 이벤트는 라우트된 이벤트를 지원하기 때문에 버블링터널링이 모두 가능합니다예를 들어 키보드를 누르는 입력 이벤트는  KeyDown, PreviewKeyDown 이벤트가 연결되어 있습니다.

기본 입력 API 이외에도 Keyboard 클래스와 Mouse 클래스는 키보드 및 마우스 입력을 처리하기 위해 추가 API를 제공합니다.

 

 

- Keyboard 클래스

 

Keyboard 클래스는 키보드 관련 이벤트메서드키보드상태에 관한 속성을 제공해 줍니다. 

다음 표는 키보드 입력 이벤트들을 나열해 놓은 것입니다.

 

이벤트

설명

PreviewGodKeyboardFocus,

GodKeyboardFocus

컨트롤이 포커스를 받았을 때

PreviewLostKeyboardFocus,

LostKeyboardFocus

컨트롤이 포커스를 잃었을 때

GotFocus

컨트롤이 논리적 포커스를 받았을 때

LostFocus

컨트롤이 논리적 포커스를 잃었을 때

PreviewKeyDown, KeyDown

키가 눌렸을  

PreviewKeyUp, KeyUp

키가 눌렸다 떼어졌을 때

PreviewTextInput, TextInput

컨트롤이 텍스트 입력을 받았을 때



예제를 통해 간단한 키입력에 관한 이벤트와 몇가지 속성메서드에 대해 알아보고 Keyboard 클래스에서 제공하는 이벤트외에 UIElement에서 제공하는 이벤트에 대해 함께 알아보고 Keyboard 이벤트의 라우트된 이벤트가 지원이 되는를 터널링 이벤트를 통해 알아보도록 하겠습니다.

 

우선 VisualStudio 2008을 실행시켜 “UserInput”이라는 새 프로젝트를 생성합니다.






Window1.xaml Label 컨트롤 2개와 Textbox 컨트롤 1개를 Window Grid 안에 배치하겠습니다.

 

 

<!--Window1.xaml -->

<Window x:Class="UserInput.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window1" Height="300" Width="300" Keyboard.KeyDown="Window_Keyboard_KeyDown"  KeyDown="Window_KeyDown" >

    <Grid>

        <Label    Height="28" Margin="12,12,12,0" Name="label1" VerticalAlignment="Top">Label1</Label>

        <Label    Height="28" Margin="12,46,12,0" Name="label2" VerticalAlignment="Top">Label2</Label>

        <TextBox Margin="12,80,12,0" Name="textBox1" PreviewKeyUp="textBox1_PreviewKeyUp" Height="23" VerticalAlignment="Top" />

    </Grid>

</Window>

 

 

XAML 코드를 보시면 Window Keyboard 클래스에서 지원하는 “Keyboard.KeyDown” 이벤트와UIElement에서 지원하는 “KeyDown” 이벤트를 추가하였고 Label 컨트롤은 Grid안에 Margin으로 위치만 잡아주었습니다그리고 Textbox는 라우트된 이벤트의 tunneling을 테스트해 보기위해 라우트된 이벤트를 추가하였습니다.

 

다음으로 “Window1.xaml.cs”로 이동하여 이벤트핸들러에서 실행될 코드를 작성하겠습니다.

이벤트 핸들러에서 실행할 코드는 이벤트의 실행여부를 확인하기 위해 Label, Textbox 컨트롤에 텍스트로 표시해 주려합니다.

 

<!--Window1.xaml.cs -->

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

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 UserInput

{

    public partial class Window1 : Window

    {

        public Window1()

        {

            InitializeComponent();

        }

 

        private void Window_Keyboard_KeyDown(object sender, KeyEventArgs e)

        {

            label1.Content = "Keyboard.KeyDown";

        }

 

        private void Window_KeyDown(object sender, KeyEventArgs e)

        {

            label2.Content = "UIElement.KeyDown";

        }

 

        private void textBox1_PreviewKeyUp(object sender, KeyEventArgs e)

        {

            textBox1.Text = "textBox1_PreviewKeyUp";

        }

    }

}

 

이제 간단한 테스트 코드 작성은 끝이 났습니다 실행을 시켜 키입력 이벤트를 확인해 보시고 Textbox에 키입력으로 라우트된 이벤트 역시 실행이 되는지도 확인해 보세요




 

 

 

실행 결과로 키보드 입력이 되면 Keyboard 클래스에서 지원하는 이벤트와 UIElement에서 지원하는 이벤트가 전부 실행되며 TextBox의 라우트된 이벤트 역시 실행되는 것을 알 수 있습니다.

 

이번에는 Keyboard 클래스에서 지원하는 “GetKeyStates”메서드를 사용해 보겠습니다.

위 프로젝트에서 Keyboard.KeyDown이벤트를 그대로 사용하기 위해 이벤트 핸들러 안에 사용했던 코드(label1.Content = "Keyboard.KeyDown";)를 주석 처리하겠습니다.

그리고 아래 코드를 입력하겠습니다.



 

if (Keyboard.GetKeyStates(Key.Enter) == KeyStates.Down)

label1.Content = "Enter 키를 누르셨습니다.";

else

label1.Content = "Enter 키를 누르세요";

 

“GetKeyStates”메서드는 지정한 키의 상태를 가져오는 메서드로 “KeyStates”  Down, None, Toggled의 값을 가져옵니다.

위 코드는 Keyboard Down 이벤트시 ‘Enter Key’의 상태를 GetKeyStates로 확인하여 엔터키가 “Down”이 되었다면 그에 해당하는 메시지를 Label에 보여주는 동작을 하게 될 것입니다.

 

그럼 실행을 시켜  결과를 보도록 하죠..

 

 

Enter Key 입력시




Enter Key 아닌 Key 입력시


 

지금까지 키보드 입력에 대해 간단히 알아보았습니다.

사용자 입력중에 키보드입력과 마우스입력은 가장 많이 사용됨으로 꼭 알아두실 필요가 있고 그리 어렵지 않으니 쉽게 익숙해지실 것입니다.

 

Keyboard 클래스에 대해서는 MSDN에서 개인적인 공부를 꼭 하시길 바랍니다.

http://msdn.microsoft.com/ko-kr/library/system.windows.input.keyboard.aspx

 

 

 

이번 시간은 사용자 입력의 첫번째 시간으로 키보드 입력에 대해 알아보았습니다.

다음 시간에는 계속해서 마우스를 이용한 이벤트즉 마우스 입력에 대해 알아보도록 하겠습니다.

수고하셨습니다.








 

 

 

Posted by 强太風
  1. ADC

    포커스나 논리적 포커스가 키보드에서 무슨 의미를 하는건가요??

    2009/08/04 16:48 ADDR : EDIT/ DEL : REPLY ]
    • 키보드입력을 이용해 키보드 클래스의 관련 이벤트를 사용하려면 우선 키보드입력을 받은 요소(Control)가 무엇인지 알려줘야겠죠?.. 포커스는 요소가 입력받을 준비?, 입력 받을 요소가 입력 받을 상태가 가능한 상태로 만들어주는 것입니다..

      2009/08/04 22:34 ADDR : EDIT/ DEL ]
  2. 이영민

    엔터키 예제에서... 엔터키를 누를때 마다 키 상태가 토글되는것 같은데, 제가 뭘 잘못 입력해서일까요?

    2010/08/13 10:57 ADDR : EDIT/ DEL : REPLY ]
    • 안녕하세요 제가 휴가를 다녀오느라 답변이 늦었내요..
      질문하신 내용은 Enter키를 누를때 마다 키 상태가 토글되는 것을 말씀하신것 같은데 이영민님이 잘못하신것은 없구요. Enter키가 토글 되는것은 테스트를 해보시면 아시겠지만 Enter키 뿐만 아니라 다른키 역시 key 상태가 Down -> Toggle -> Down -> Toggle 로 변경되게 되는 것을 아실 수 있을 겁니다. 예제에서 If 문을 다음과 같이 수정해보세요.. if (Keyboard.IsKeyDown(Key.Enter) == true) 그럼 Enter Key가 Down되었을때의 Key상태를 알 수 있을 것입니다.

      2010/08/30 13:36 ADDR : EDIT/ DEL ]
  3. 나며기

    강좌완 크게 관계가 없겠지만 Enter키 체크 부분을 아래와 같이 고쳐주시면 정확하게 체크가 가능합니다
    ^_^;
    (엔터키 누르고 다시 누르면 비정상 동작합니다 ㅎㅎ;)

    if((Keyboard.GetKeyStates(Key.Enter) & KeyStates.Down) > 0)

    강의 잘 듣고있습니다.

    마지막 강의를 향하여!!! 고고싱

    2012/08/23 14:47 ADDR : EDIT/ DEL : REPLY ]
  4. 다른 cs 파일에서 textBox1를 조작할려면 어떻게 해야 하나요?

    2013/03/25 16:19 ADDR : EDIT/ DEL : REPLY ]


반응형

+ Recent posts