2011-02-01 7 views
14

에는 TabItem 컨트롤에 TextBox 항목 (MyTextBox)이 있습니다. 나는 다음과 같이 보이는 코드를 가지고 :WPF - Keyboard.Focus()가 작동하지 않는 이유는 무엇입니까?

MyTextBox.Focus(); 
Keyboard.Focus(MyTextBox); 

라인이 실행 된 후 나는 다음을 참조 디버거를 통해이 코드를 실행하면 :

MyTextBox.IsFocused = true 
MyTextBox.IsKeyboardFocused = false 

텍스트 상자가 아닌 사람이 왜 말해 줄 수 키보드 포커스를 받고 있습니까? 그것은 활성화 된 표준 TextBox 컨트롤 일뿐입니다.

+0

꼭 확인하십시오. 이 호출이 이루어지면 TabItem이이 컨트롤을 Visible에 표시합니까? 나는 컨트롤이이 속성에 대해 표시되도록 설정해야한다고 생각합니다. – Matt

+0

@Matt - 고마워요. 나는 그것을 검사 할 것이다. –

+0

이것을 재현 할 수 없습니다. IsFocused와 IsKeyboardFocused 모두 True로 나온다. –

답변

8

MyTextBox.IsKeyboardFocused 당신이 디버거에서 그것을보고하고 키보드 포커스가 Visual Studio에서 아마 때문에 거짓 ... 중단없이 (예를 들어, Debug.Write 또는 brakepoints 추적) 디버깅 초점을 시도 런타임에 MyTextBox.IsKeyboardFocused의 실제 값을 볼 수 있습니다.

또한 Focus() 메서드는 포커스가 성공적으로 설정되었는지 여부를 나타내는 부울 값을 반환합니다. 당신의 경우에 False을 돌려 주나요? 그렇다면 무엇이 잘못되었는지를 알아 내기 위해 stepping intoFocus() 메소드를 제안 할 것입니다.

8

우리의 동료가 위에 열거 한 것 이외의 요소에 포커스를 설정하려고하면 WPF가 크로스 스레드 작업을 허용하지 않는다는 것을 알아야합니다.

경우에 따라이 예외는 Focus 메서드 호출의 경우와 같이 발생하지 않습니다. 이 문제를 해결하기 위해 수행 한 작업은 키보드 포커스가 포함 된 모든 코드를 액션에 호출하는 것입니다.

이 작업은 내 코드는 UI 스레드가 아닌 다른 스레드에서 실행되고 있지 않은지 확인하기 위해 제어 디스패처 내에서 실행됩니다 (예를 들어, 타이머 이벤트 또는 다른 스레드에서 제기 이벤트) :

[UIElement].Dispatcher.BeginInvoke(
     new Action(
     delegate{ 
      /// put your Focus code here 
     } 
    ) 
); 
1

여기 허용 대답에 상관없이 디버거를 알려줍니다 무엇 초점을 얻을하지 말아 텍스트 상자의 문제를 해결하지 않습니다. 텍스트 상자가 있고 텍스트 상자에 글을 쓸 수 있다면 키보드 중심입니다. Keyboard.Focus does not work on text box in WPF

:

나는이 여기에 문제 해결 (실제로 초점을 얻고는 디버거에 초점이처럼 보이는, 그래서 그냥 값을 설정), 그것은 "초점 코드"파블로프의 대답하지만 매우 가깝게 발견
관련 문제