Event Routing
부모 클래스부터 이루어지는 Tunneling 이 먼저 처리되고, 자식 클래스부터 처리되는 Bubling 이 이어짐.
Tunneling : 부모가 자식의 이벤트를 먼저 봄.
Bubling : 자식이 먼저 받고 처리 안된 경우 부모로 넘어감.
eventArg 의 Handled 속성을 true 하면 이러한 루틴이 끊김.
처리했으면 true 로 하는 습관.
UIElement 를 상속하는 클래스는 마우스, 키보드 관련 이벤트를 가진다.
Control, Panel 은 UIElement 를 상속한다는 것을 참고.
위에서 설명했듯 Preview 버전의 이벤트핸들러도 존재.
이와 함께 쓰이는 것은 System.Windows.Input 에 있는 Mouse 전역 클래스이다. 잘 쓰는 것만 보면..
Mouse.GetPosition(relativeTo)
: Window 나 Control, Panel 이 인자로 들어가, 그것을 기준으로 한 상대 좌표를 가져옴.
Mouse.Capture(element)
: 영역을 벗어났을 때에도 인자로 주어진 영역에 포커스 맞춰주게 함. null 넣으면 초기화.
: Drag, Drag and Drop 할 때 이용
Tunneling : 부모가 자식의 이벤트를 먼저 봄.
Bubling : 자식이 먼저 받고 처리 안된 경우 부모로 넘어감.
eventArg 의 Handled 속성을 true 하면 이러한 루틴이 끊김.
처리했으면 true 로 하는 습관.
UIElement 를 상속하는 클래스는 마우스, 키보드 관련 이벤트를 가진다.
Control, Panel 은 UIElement 를 상속한다는 것을 참고.
Mouse Event
1 | <Canvas x:Name="canvas01" MouseDown="canvas01_MouseDown" MouseMove="canvas01_MouseMove" MouseUp="canvas01_MouseUp"/> | cs |
Xaml 에서 마우스관련 이벤트는 위처럼 받음.
MouseDown, MouseUp, MouseMove, MouseEnter, MouseLeave, MouseLeft/Right ButtonDown/Up, MouseWheel 등이 있다.위에서 설명했듯 Preview 버전의 이벤트핸들러도 존재.
이와 함께 쓰이는 것은 System.Windows.Input 에 있는 Mouse 전역 클래스이다. 잘 쓰는 것만 보면..
1 2 | Point p = Mouse.GetPosition(GridMain); Debug.WriteLine(String.Format("grid x : {0:f} y : {1:f}", p.X, p.Y)); | cs |
: Window 나 Control, Panel 이 인자로 들어가, 그것을 기준으로 한 상대 좌표를 가져옴.
1 2 3 4 5 6 7 | Mouse.Capture(canvas01); Mouse.OverrideCursor = Cursors.Hand; ... Mouse.Capture(null); Mouse.OverrideCursor = null; | cs |
: 영역을 벗어났을 때에도 인자로 주어진 영역에 포커스 맞춰주게 함. null 넣으면 초기화.
: Drag, Drag and Drop 할 때 이용
: 위 예시는 처음 캡처시 마우스모양이 손모양이다가 후에 원래대로 돌아옴
UIElement 는 위를 이용해 자신의 윈도우를 기준으로 한 상대좌표를 얻을 수 있음.
1 2 | Point p3 = canvasMain.TransformToAncestor(this).Transform(Mouse.GetPosition(canvasMain)); Point p6 = canvasMain.TransformToAncestor(this).Transform(new Point(110.0, 0.0)); | cs |
부모윈도우의 상대좌표 = 자식윈도우.TransformToAncestor(부모윈도우).Transform(자식윈도우의 상대 좌표);
KeyBoard
1 | <TextBox x:Name="txtFind" Keyboard.KeyDown="txtFind_KeyDown"/> | cs |
Xaml 에서 키보드 관련 이벤트는 위처럼 받음.
위 예시에선 txtFind_KeyDown 핸들러에서 Ctrl + F 누르면 관련 함수 실행할지도.
이벤트 핸들러 인자인 KeyEventArgs 의 Key 에서 입력된 키를 얻을 수 있음.
Mouse 처럼 System.Windows.Input 에 Keyboard 전역 클래스가 있음.
Mouse 처럼 System.Windows.Input 에 Keyboard 전역 클래스가 있음.
Key 라는 enum 에서 원하는 키가 다 정의 되어 있음.
1 2 3 4 5 6 7 8 9 10 11 12 | if(e.Key == Key.A) { MessageBox.Show("sadf"); } if ((System.Windows.Input.Keyboard.Modifiers & ModifierKeys.Control) != 0) { MessageBox.Show("ctl"); } if (Keyboard.IsKeyDown(Key.LeftAlt) && Keyboard.IsKeyDown(Key.S)) { MessageBox.Show("Save"); } | cs |
키 받는 법은 위처럼 여러 방법이 있음.
동시에 눌린 키보드는 Keyboard 클래스를 이용하는게 편함.
AccessKey 도 비슷한 일을 함
Content 등에 (_K) 가 포함되면 Alt + K 를 누르면 자동으로 포커스 자신으로 바뀜.
FocusManager.FocusedElement = "{Binding ElementName = elementName}";
을 통해서 포커스 대상도 지정 가능.
댓글 없음:
댓글 쓰기