2011-05-10 6 views
0

사용자 컨트롤 내에 두 개의 UIElement 탭 인덱스를 설정하려고합니다. 사용자 정의 컨트롤에는 텍스트 상자와 버튼이 있습니다. 나는 현재 첨부 된 속성을 통해 텍스트 상자에 적용되고 있지만 탭 키를 누르고 텍스트 블록에서 단추로 이동하거나 키 누르기 (Enter 키)를 감지하고 단추에서 명령을 트리거 할 수있는 기능을 원합니다. (나는 별도의 질문을 안다)MVVM에서 UIElements의 Silvelright -set tabindex

주요 초점은 탭 인덱스를 먼저 달성하는 것이다.

어떤 조언이나 제안에 감사드립니다.

UPDATE

나는했습니다 이것이 내가 tabIndex 속성이 존재하지 않는다는 것을 나는 오류가 컴파일 할 때 그러나 탭 순서를

 public static DependencyProperty TabIndexProperty = DependencyProperty.RegisterAttached("TabIndex", typeof(int), typeof(AttachedProperties), null); 
    public static void SetTabIndex(UIElement element, int value) 
    { 
     Control c = element as Control; 
     if (c != null) 
     { 

      RoutedEventHandler loadedEventHandler = null; 
      loadedEventHandler = new RoutedEventHandler(delegate 
       { 
        HtmlPage.Plugin.Focus(); 
        c.Loaded -= loadedEventHandler; 
        c.Focus(); 
       }); 
      c.Loaded += loadedEventHandler; 
     } 
    } 

을 처리하기 위해 연결된 속성을 사용하려고하기 때문에 버튼 컨트롤 용. 이 아이디어가 실패한 이유는 무엇입니까?

답변

0

늦은 시간에 ... 첨부 된 속성을 사용하여 해결했습니다. 위의 솔루션에서 내가 만든 이전 DP를 복사했고 테스트하기 전에 코드를 변경하지 않았습니다. 사용자 컨트롤로드되면되도록

 #region Search Field Focus 

    public static DependencyProperty InitialFocusProperty = DependencyProperty.RegisterAttached("InitialFocus", typeof(bool), typeof(AttachedProperties), null); 

    public static void SetInitialFocus(UIElement element, bool value) 
    { 
     Control c = element as Control; 
     if (c != null && value) 
     { 
      RoutedEventHandler loadedEventHandler = null; 
      //set focus on control 
      loadedEventHandler = new RoutedEventHandler(delegate 
       { 
       HtmlPage.Plugin.Focus(); 
       c.Loaded -= loadedEventHandler; 
       c.Focus(); 
      }); 
      c.Loaded += loadedEventHandler; 
     } 
    } 

    public static bool GetInitialFocus(UIElement element) 
    { 
     return false; 
    } 
    #endregion 

    #region Tabbing Order of Elements 

    public static DependencyProperty TabIndexProperty = DependencyProperty.RegisterAttached("TabIndex", typeof(int), typeof(AttachedProperties), null); 
    public static void SetTabIndex(UIElement element, int value) 
    { 
     element.SetValue(TabIndexProperty, value); 
    } 

    public static int GetTabIndex(UIElement element) 
    { 
     return (int)element.GetValue(TabIndexProperty); 
    } 
    #endregion 

제 DP가 된 본체의 포커스를 설정 아래

내가 연결된 속성 클래스를 생성하고 다음 코드를 추가 작동 용액

인 텍스트 필드 내에 커서가 위치하게됩니다.

DP 2는 탭 순서를 설정합니다. 포커스가 이미 현재 컨트롤에 적용되었으므로 탭 이동이 정상적으로 이루어집니다. 컨트롤에 중점을 두지 않았다면 먼저 설정해야합니다.

마지막으로 xaml에서 클래스를 xmlns로 선언하고 컨트롤에 추가합니다.

2

이것은보기와 관련된 사항이므로 MVVM에서도 ViewLevel에서 처리해야합니다. MVVM은 코드 뒤에서 모든 코드를 제거한다고 명시하지 않습니다. 이는 코드를 작성할 때 특정 관심사가 있어야 함을 의미합니다. 이 사건 중 하나입니다.

+0

Scott과 나는 다른 사람들이 코드가보기에 특정한 것이면 그 코드가보기 코드에서 처리 될 수 있다는 점을 들었다. – rlcrews

+0

그럼 왜이 작업은 텍스트/단추의 TabIndex 속성 대신 연결된 속성을 사용하여 수행합니까? –

+0

사용자 정의 컨트롤이 초기화 된 상태 (뷰에로드 된 경우)에서 xaml 내에서 TabIndex 속성이 설정되는 것을 방지합니다. Associated 속성을 사용하면 MVVM 프로젝트와 함께이 예외를 발견했습니다. – rlcrews