2011-09-03 4 views
2

문자 그대로, 나는 그것을 알고 싶다.Control.Focus()와 FocusManager.SetFocusedElement()의 차이점

어떤 경우에는 .Focus()가 SetFocusedElement()보다 잘 나타납니다. 하지만 또 다른 경우는 반전입니다. 그래서 나는 다른 것들이 무엇인지 알아야합니다.

또한 MSDN에서 .Focus()는 키보드 포커스 용이고 SetFocusedElement는 논리적 포커스 용입니다. 하지만 논리적 초점과 키보드 초점 간에는 다른 점이 없습니다.

답변

6

키보드 포커스는 일반적으로 사용자가 입력 한 경우 키보드 입력을받는 컨트롤이기 때문에 일반적으로 이해하기가 쉽습니다. 따라서 TextBox를 클릭하면 키보드 포커스를 받게되고 입력을 시작할 수 있습니다. 다른 컨트롤은 다른 비헤이비어를 가지고 있으며 실제로 키보드를 지원하지 않을 수 있지만 여전히 키보드 포커스를 얻을 수 있습니다.

논리적 초점의 경우 응용 프로그램을 여러 부분으로 구성 할 수 있습니다. 예를 들어, 대부분의 응용 프로그램에는 도구 모음/리본이 맨 위에 있고 그 다음에는 주요 내용이 있습니다. 이제 귀하의 컨텐츠가 현재 키보드 포커스가있는 TextBox라고 상상해보십시오. ToolBar/리본 컨트롤을 클릭하면 키보드 포커스가 해당 컨트롤로 이동합니다. 그러나 실제로 콘텐츠의 TextBox가 전에 키보드 포커스를 가졌다 고 "기억"하고 싶습니다.

이렇게하려면 ToolBar/리본이 새로운 "포커스 범위"를 만듭니다. 따라서 ToolBar/리본 컨트롤을 클릭하면 키보드 포커스를 이동하지만 TextBox에는 여전히 해당 창에 대한 논리적 포커스가 있습니다. 이렇게하면 사용자가 ToolBar/Ribbon 작업을 마쳤을 때 TextBox에 키보드 포커스가 다시 주어집니다.

응용 프로그램에 키보드 포커스가 없기 때문에 다른 응용 프로그램과 상호 작용하는 경우에도 마찬가지입니다. 응용 프로그램에서 다시 작업 할 때 논리적 인 초점을 사용하여 누가 마지막으로 키보드 포커스를 가졌는지 (그리고 다시 복원해야하는지) 알 수 있습니다.

1

FocusManager.SetFocusedElement()을 사용하면 요소에 포커스를 설정하려는 UserControl을 지정할 수 있습니다. 따라서 프로그램의 다른 부분에있는 컨트롤에 중점을 둘 수 있습니다.

Control.Focus()은 간단합니다.이 컨트롤에 초점을 맞 춥니 다 (더 직관적입니다).

야생 추측 : FocusManager.SetFocusedElement()을 부적절하게 사용합니다. 결과적으로 원하지 않는 동작이 발생하지만 실제로는 똑같습니다.

Sidenote : "논리적"포커스와 "키보드"포커스는 WPF에서 2 different things입니다.