[wpf] WPF : TextBox에서 프로그래밍 방식으로 포커스를 제거하는 방법

내 WPF에 간단한 (적어도 그랬다고 생각한) 동작을 추가하고 싶습니다 TextBox.

사용자가 Escape 키를 누르면 TextBox편집중인 사용자가 사용자가 편집을 시작했을 때의 텍스트를 가지기를 원하고 TextBox.

편집 시작 부분에 있던 값에 대한 텍스트를 설정하는 데 문제가 없습니다.

문제는 요소의 초점을 제거하는 것입니다. 포커스를 다른 구성 요소로 옮기고 싶지 TextBox않고 포커스를 잃고 싶을뿐입니다 . 초점 TextBox을 잃을 수 있도록 초점을 설정하려면 보이지 않는 요소가 있어야 합니까?



답변

.NET Framework 4에서 Keyboard.ClearFocus();


답변

내가 사용하고있는 코드 :

// Move to a parent that can take focus
FrameworkElement parent = (FrameworkElement)textBox.Parent;
while (parent != null && parent is IInputElement && !((IInputElement)parent).Focusable)
{
    parent = (FrameworkElement)parent.Parent;
}

DependencyObject scope = FocusManager.GetFocusScope(textBox);
FocusManager.SetFocusedElement(scope, parent as IInputElement);


답변

파티에 조금 늦었지만 도움이되었으므로 여기에 있습니다.

.Net 3.0 이후 로 나를 위해 트릭을 수행 FrameworkElementMoveFocus 기능이 있습니다.


답변

위의 답변 중 어느 것도 저에게 효과가 없었고 수락 된 답변은 키보드 포커스에서만 작동하므로 다음 접근 방식에 도달했습니다.

// Kill logical focus
FocusManager.SetFocusedElement(FocusManager.GetFocusScope(textBox), null);
// Kill keyboard focus
Keyboard.ClearFocus();

논리적이고 키보드 포커스를 모두 죽입니다.


답변

포커스 가능한 상위 항목에 포커스를 설정할 수 있습니다. 이 코드는 텍스트 상자가 동일한 템플릿 내에 포커스 가능한 조상이없는 템플릿 내부에있는 경우에도 작동합니다.

DependencyObject ancestor = textbox.Parent;
while (ancestor != null)
{
    var element = ancestor as UIElement;
    if (element != null && element.Focusable)
    {
        element.Focus();
        break;
    }

    ancestor = VisualTreeHelper.GetParent(ancestor);
}


답변

AFAIK, 초점을 완전히 제거하는 것은 불가능합니다. 창에있는 항목은 항상 포커스를 갖습니다.


답변

Windows Phone 개발에서 방금 수행 Focus()했거나 PhoneApplicationPagethis.Focus() 에서 수행했으며 매력처럼 작동했습니다.