이것은 이상한 것이고 무엇을 검색해야할지 모르지만 실제로는 저를 신뢰합니다.WPF TextBox 커서 이동 및 포커스 변경
텍스트 상자가 있고 그 내용이 OnTextChanged
이면 다음과 같은 방법입니다.
여기서 텍스트 상자에 포커스를 지정하고 커서를 TextBox의 끝으로 이동 한 다음 실제로 포커스가 설정된 항목 (일반적으로 단추)으로 포커스를 되돌립니다. 문제는 TextBox가 "redrawn"(더 좋은 단어가 없기 때문에) 인 것 같아요. 포커스를 원래의 포커스 된 요소로 되돌려 보내 커서 위치가 화면에 나타나지 않도록합니다. .
현재이 문제를 근본적으로 해킹하여 기본적으로 이전에 초점을 맞춘 항목의 초점을 10ms 지연시키고 다른 스레드에서 UI를 업데이트 할 시간을 갖습니다. 자, 이것은 분명히 임의의 시간이며 내 컴퓨터에서 잘 작동하지만 이전 컴퓨터에서이 응용 프로그램을 실행하는 사용자는 문제가있을 수 있습니다.
적절한 방법이 있습니까? 나는 그것을 이해할 수 없다.
private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
{
if (sender == null) return;
var box = sender as TextBox;
if (!box.IsFocused)
{
var oldFocus = FocusManager.GetFocusedElement(FocusManager.GetFocusScope(this));
box.Select(box.Text.Length, 0);
Keyboard.Focus(box); // or box.Focus(); both have the same results
var thread = new Thread(new ThreadStart(delegate
{
Thread.Sleep(10);
Dispatcher.Invoke(new Action(() => oldFocus.Focus()));
}));
thread.Start();
}
}
편집 내가 가진 새로운 아이디어는 내가 다음을 시도 UI가 너무 업데이트 완료되면 oldFocus.Focus() 메소드를 실행했지만, 난 같은 결과를 얻을 :(
을
var oldFocus = FocusManager.GetFocusedElement(FocusManager.GetFocusScope(this));
Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
{
box.Select(box.Text.Length, 0);
box.Focus();
}));
Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(() => oldFocus.Focus()));
이 태그는 WPF 응용 프로그램이라고 생각합니다. 태그를 변경했습니다. 일반적으로 우리가 어떤 종류의 응용 프로그램을 작성하는지 알려주어 잘못 추측 할 필요가 없습니다. –
사과드립니다. 나는 앞으로 잊지 않을 것이다. – Skinner927
강제로 다시 그리기 위해 oldFocus.Invalidate()를 시도 했습니까? –