2009-08-30 2 views
4

SL3 앱에서 한 컨트롤에서 "다음 컨트롤"로 자동 탭할 수 있어야한다는 요구 사항이 있습니다. 예를 들어 TextBox는 3 자로 제한됩니다. 세 번째 문자를 입력 할 때 포커스는 자동으로 양식의 다음 컨트롤로 이동해야합니다 (실제 사용법은 약간 다르지만 예제는 충분합니다).Silverlight 3의 자동 탭

그러나 SL이 탭 시퀀스를 자동으로 결정하므로 리버스 엔지니어링/복제에서 따로 따로 수행하는 방법이 아닌 것 같습니다. 시각적 트리에서 어떤 컨트롤이 포커스를 얻을 수있는 컨트롤인지 알아내는 것입니다 .

이미 구현 한 사람이 있습니까?

답변

2

일반화 된 솔루션을 찾고 있으며 레이아웃 트리 배치와는 달리 시각적 트리 정렬을 기반으로하는 것이 좋으면 그렇게 나쁘지 않을 것이라고 생각합니다. 그래도 그 일을 듣지 못 했어.

대부분의 전화 번호 또는 신용 카드 입력 양식은 정당한 문자 수를 입력하면 올바른 변경 처리기의 다음 필드를 정직하게 코딩합니다.

자동 초점 솔루션 (3 문자)이 이미 TextChanged 이벤트를 모니터링하고 이벤트 연결을 필요로하는 것처럼 들리므로 먼저 포커스를 하드 코딩해야합니다.() 당신이 알고있는 다음 폼 요소에 2) 태그 속성을 사용하여 다음에 포커스를 지정하려는 컨트롤의 이름을 저장 한 다음 FindName + Focus를 수행하거나 3) VisualTreeHelper (또는 동료를 통한 논리 트리 검색)?

4

나는 꽤 일반화 된 솔루션을 찾고 있었지만, 꽤 구체적인 것을 만들 수있었습니다. 기본적으로 VisualTreeHelper를 사용하여 옆에있는 탭과 동일한 부모를 가진 자식을 찾습니다. 그 초점을 맞춘다.

내 컨트롤을 모두 거치지 않고 (상당히 큰 LOB 응용 프로그램을위한 것입니다.) 각 개체에 대해 "다음"컨트롤을 구성하는 것보다 더 좋은 해결책입니다.

다른 사람에게 도움이 될 경우를 대비하여 여기에 내 코드가 있습니다.

public static void TabNext(DependencyObject parentElement, Control fromControl) 
{ 
    var children = VisualTreeHelperUtil.FindChildren<Control>(parentElement). 
     Where(c => c.IsEnabled && c.IsTabStop && c.Visibility == Visibility.Visible). 
     ToList(); 

    if (children.Contains(fromControl)) 
    { 
     var thisIndex = children.IndexOf(fromControl); 
     var targetIndex = thisIndex + 1; 
     if (children.Count > targetIndex) 
     { 
      var targetChild = children[targetIndex]; 
      fromControl.Dispatcher.BeginInvoke(() => 
       { 
        targetChild.Focus(); 
        var txt = targetChild as TextBox; 
        if (txt != null) 
        { 
         txt.SelectAll(); 
        } 
       }); 
     } 
    } 
} 
+0

감사 @Craig 시어러이 공유를위한 (VisualTreeeHelperUtil는 VisualTreeHelper 일부 유틸리티 기능을 추가하는 내 자신의 클래스이다). 일부 코드를 사용하여 사용자 지정 연결 동작을 완료했습니다. 코드를 살펴보십시오. https://gist.github.com/4576803 –

관련 문제