가능한 가장 간단한 적용 :
<Page
x:Class="TestApp.MainPage"
...>
<Grid>
<TextBox />
</Grid>
</Page>
질문 : 응용 프로그램 시작시 커서 (포커스)가 TextBox에 설정되는 것을 방지하는 우아한 방법이 있습니까?
확장하려면 : 내 진짜 문제는 TextBox가 포커스를받을 때 열리는 팝업이 있다는 것입니다. 내 PopUp에서 요소를 클릭하면 닫아야하지만 TextBox가 내 페이지의 첫 번째 포커스 가능한 요소이기 때문에 자동으로 포커스를 받고 PopUp이 즉시 다시 열립니다. 내가 생각하는 문제의 핵심은 위의 예에 나와 있습니다.
초점과 같은 다양한 속성에 의해 관리되고 IsTabStop
, TabIndex
, IsHitTestVisible
,와 FocusManager
클래스입니다. 창이 활성화되면 첫 번째 포커스 가능 요소에 초점을 맞추는 기본 제공 기능이 있으며이 동작은 일반적으로 사용자 지정할 수 없습니다.
페이지 자체와 같이 텍스트 상자 대신 초점을 맞출 다른 요소를 지정할 수 있습니다.
<Page IsTabStop="True">
<TextBox/>
</Page>
이것은 페이지가 텍스트 상자 대신 초기 초점을 얻지 만 이제 페이지가 탭 동작에 참여하므로 약간 바람직하지 않습니다.
일반적으로 프레임 워크는 RootScrollViewer가 탭 정지가 아니더라도 (탭으로 포커스를받을 수 없음) 포커스가있는 컨트롤을 클릭 할 때 RootScrollViewer에 포커스를 설정합니다. 페이지로드시 RootScrollViewer에 초점을 맞출 수있는 경우 프레임 워크는 무언가에 초점 이 있음을 감지 하고 첫 번째 요소에 초점을 맞추려고 시도하지 않습니다.
<Page Loaded="onPageLoaded">
<TextBox/>
</Page>
private ScrollViewer getRootScrollViewer()
{
DependencyObject el = this;
while (el != null && !(el is ScrollViewer))
{
el = VisualTreeHelper.GetParent(el);
}
return (ScrollViewer)el;
}
private void onPageLoaded(object sender, RoutedEventArgs e)
{
getRootScrollViewer().Focus(FocusState.Programmatic);
}
이것은 텍스트 상자가 자동으로 초점을 맞추는 것을 방지하기 위해 내가 아는 가장 "우아한"방법입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다